天天看点

Java常见问题之初始化过程

假设有个名为dog的类

对于静态字段:

1. 当首次创建类型为dog的对象时,或者dog类的静态字段/静态方法首次被访问时,java解释器会查找类路径,以定位dog.class文件。

2. 载入dog.class,此时初始化所有静态字段,如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null。

对于非静态字段:

1. 当创建类型为dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字段被设置成了null。

2. 执行所有出现于字段定义处的初始化动作。

3. 执行构造器。

假设类dog有一个父类animal

2. 当载入dog.class时,编译器注意到它有一个父类animal,于是继续加载animal.class,此时首先初始化类animal的所有静态字段,然后初始化类dog的所有静态字段。如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null。

2. 执行父类animal中所有出现于字段定义处的初始化动作。

3. 执行父类animal的构造器。

4. 执行子类dog中所有出现于字段定义处的初始化动作。

5. 执行子类dog的构造器。

注意:

静态字段只会进行一次初始化操作。

每次创建类型为dog的对象时,都会对非静态字段进行初始化操作。

静态字段由dog类的所有对象共享,只占用一份存储区域。

非静态字段是与dog类的对象相关联的,每个对象都有自己独立的存储区域。

当首次创建类型为dog的对象时,会先初始化静态字段,再初始化非静态字段。

dog类的静态字段/静态方法首次被访问时,只会初始化静态字段,不会初始化非静态字段。