Java对象的初始化顺序,原理版,不用死记
看了好多对Java初始化顺序的解释,都是给出验证案例。其实我还是比较喜欢根据原理理解记忆,结合前段时间学习的JVM,给出了基于自己理解的解释,如有不对,欢迎指出。
1.同一个类中,先执行 clinit ,再执行init
clinit : 静态属性的初始化:初始化顺序是根据静态成员的定义从上往下初始化。
init:构造器和非静态变量初始化:初始化顺序是 非静态成员从上往下,最后构造器
2.存在继承关系中,先执行父类clinit,再执行子类clinit,后执行父类init 再执行子类init
附,验证代码:
public static void main(String[] args) { B b = new B(); } } class C { { System.out.println("C ! static block"); } private A test = new A("C mem"); static { System.out.println("C static block"); } public static A a = new A("C static mem"); C(){ System.out.println("C Construct"); } } class B extends C{ { System.out.println("B ! static block"); } private A test = new A("B !static mem"); static { System.out.println("B static block"); } public static A a = new A("B static men"); B(){ System.out.println("B Construct"); } } class A { A(String str){ System.out.println(str); } }
关于我对main方法与静态成员的执行的理解,请移步 :Java中的main方法