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方法

原文地址:https://www.cnblogs.com/yzw-daemon/p/13273080.html