Java类的初始化过程及清理
一、类的数据成员初始化
Java中类的数据成员初试化可能有两种形式。
- 在定义类成员变量的地方直接提供初始化值(这是C++中不允许的)
- 在构造器中初试化。(Java中不存在类似C++中的初始化列表)
两者的区别是,第一种方式是数据成员直接初试化为提供的初始化值,而在构造器中初始化,其实在数据成员已经初试化为默认值(比如基本类型如int 初始化为0,引用类型初试为null,其实在在构造器已经不能称为初始化了,应该是赋值)
初始化顺序
- 如果有静态变量则先初始化静态变量,如果基类中也有静态变量且之前没有初始化过,则先初始化基类中的静态变量再初始化子类的静态变量(静态变量只初始化一次,如果已经初始化则不再初始化)
- 如果类有基类则按照基类中的变量的定义顺序初始化变量,然后调用基类的构造函数;
- 按照类中变量的定义顺序初试化变量,然后调用构造函数。
java中有继承体系的类型也是先构造其基类,再构造子类。
二、垃圾回收
java中没有c++中对应的析构函数,如果java不再使用需要处理,再必须手动调用对应的处理函数。java中对应的对象的销毁,使用java的gc机制处理。
对于finalize()不是析构函数,他的调用时机不确定,只在垃圾回收器准备好释放对象占用的空间时,首先调用其finalize()方法。
对于java中的gc机制采用“停止-赋值”,“标记-清扫”等方式。具体有待详细了解。