Java对象初始化顺序
在实例化对象前,如果没有加载过相应的类信息,那么会首先加载类,然后才实例化对象。
在这种情况下,顺序为:
a. 加载类
- 为父类静态属性分配内存并赋值 / 执行父类静态代码段 (静态代码块和静态成员,先后按照实际的代码顺序,进行初始化)
- 为子类静态属性分配内存并赋值 / 执行子类静态代码段 (按代码顺序)
b. 创建对象
- 为父类实例属性分配内存并赋值 / 执行父类非静态代码段 (按代码顺序)
- 执行父类构造器
- 为子类实例属性
- 执行子类构造函数
加载类的过程只会执行一次,因此,今天成员的初始化也只有一次,在此只会,再进行子类对象初始化,只会执行普通成员和构造函数的初始化。
用代码进行测试:
用代码进行测试:
public class Father { Another a = new Another("father 普通成员"); static Another a1 = new Another("father 静台成员"); static { Another a2 = new Another("father static block"); } public Father(){ System.out.println("执行father构造"); } }
子类:
public class Son extends Father{ static Another aa1 = new Another("son 静态成员"); Another a2 = new Another("son 普通成员"); static{ Another a2 = new Another("son 静态代码块"); } public Son(){ System.out.println("执行Son构造函数"); } }
测试类:
public class Test { static { System.out.println("静态代码块执行"); } public static void main(String[] args) { Son tn = new Son(); } }
输出为:
静态代码块执行
father 静台成员
father static block
son 静态成员
son 静态代码块
father 普通成员
执行father构造
son 普通成员
执行Son构造函数
参考:https://www.zhihu.com/question/49196023/answer/114859346