JAVA初始化顺序:
1.初始化静态属性,即静态代码和静态变量。按照先父类再子类的顺序初始化。
2.初始化类属性,即成员变量、代码块和构造函数。其中类变量和代码块优先级相同且均优先于构造函数。也是按照先初始化父类再子类的顺序。
我们可以看到,类的初始化分为两大部分:即静态属性和非静态属性。静态属性优先于非静态属性。
优先级层次(相同优先级的属性按程序先后顺序初始化):
第一级:静态属性
1. 父类: 静态成员变量=静态代码块
2. 子类: 静态成员变量=静态代码块
第二级:非静态属性
1. 父类:
1.1 成员变量 = 代码块
1.2 构造函数
2. 子类:
2.1 成员变量 = 代码块
2.2 构造函数
测试代码:
测试结果:
结果分析:
在子类的代码中,我们故意将静态代码块、静态变量、成员变量,代码块和构造函数顺序调整。可以看到程序的执行结果始终严格按照上面所列的优先级执行。
/*********延伸**********/
为什么会子类的静态代码出现在父类的非静态属性之前呢,这里涉及到Java的装载和实例化。
类的加载和实例化顺序:
1) 在堆内存中生成class对象, 把静态变量和静态方法加载到方法区, 这个堆内存中的class对象是方法区数据的入口
2) 静态变量默认初始化
3) 静态变量显式初始化
4) 执行静态代码块
5) 成员变量默认初始化, 显示初始化
6) 执行构造函数
其中有涉及父子关系的类的装载中,先父类静态变量和代码块初始化,再子类。然后实例化时,父类成员变量和代码块初始化, 执行父类构造函数, 子类成员变量和代码块初始化, 执行子类构造函数。