类初始化顺序遵循以下三个原则(优先级依次递减)
1、静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;
2、父类优先于子类初始化;
3、成员变量按照定义先后顺序进行初始化;
例如:静态变量、非静态变量、静态代码块、非静态代码块、构造函数、父类、子类等,他们的初始化顺序是:父类静态变量 > 父类静态代码块 > 子类静态变量 > 子类静态代码块 > 父类非静态变量 > 父类非静态代码块 > 父类构造函数> 子类非静态变量 > 子类非静态代码块 > 子类构造函数。
下面给出一个不同模块初始化的初始化顺序的例子
class Base{//静态变量private static String parentParam1 = "我是父类-静态变量!";//非静态变量private String parentParam2 = "我是父类-非静态变量!";static {System.out.println("父类-静态变量是否初始化完成:parentParam1=" + parentParam1);System.out.println("父类-静态代码初始化块完成!");}{System.out.println("父类-非静态变量是否初始化完成:parentParam2=" + parentParam2);System.out.println("父类-非静态代码块初始化完成!");}public Base() {System.out.println("父类-构造函数初始化完成!");}}public class TestJavaBeanInitOrder extends Base {private static String sonParam1 = "我是子类-静态变量!";private String sonParam2 = "我是子类-非静态变量!";static {System.out.println("子类-静态变量是否初始化完成:sonParam1" + sonParam1);System.out.println("子类-静态代码块初始化完成!");}{System.out.println("子类-非静态变量是否初始化完成:sonParam2" + sonParam2);System.out.println("子类-非静态代码块初始化完成!");}public TestJavaBeanInitOrder() {System.out.println("子类-构造函数初始化完成!");}public static void main(String[] args) {new TestJavaBeanInitOrder();}}
测试结果如下:
父类-静态变量是否初始化完成:parentParam1=我是父类-静态变量!父类-静态代码初始化块完成!子类-静态变量是否初始化完成:sonParam1我是子类-静态变量!子类-静态代码块初始化完成!父类-非静态变量是否初始化完成:parentParam2=我是父类-非静态变量!父类-非静态代码块初始化完成!父类-构造函数初始化完成!子类-非静态变量是否初始化完成:sonParam2我是子类-非静态变量!子类-非静态代码块初始化完成!子类-构造函数初始化完成!