java初始化顺序

public class A {

    A(String str){
        System.out.println(str) ;
    }
    
    static A a = new A("A.static new A") ;
    
    static {
        new A("A.static block") ;
    }
    
    
    public void printA(){
        System.out.println("print method") ;
    }
    
    public static void print(){
        System.out.println("print static method") ;
    }
    
     static class C {
         C(){
             System.out.println("CCC.......") ;
         }
     }
}
public class B extends A{

    B(String str) {
        super(str);
    }

    static B b = new B("init b") ;
    static {
        new B("B static block") ;
    }
    
    static class D {//内部类
         D(){
             System.out.println("DDD.......") ;
         }
public static final D d = new D() ; }
public static void main(String[] args) { new B("main.....") ; } }

由此可知当新建一java对象(上面main方法中new B())时,它的内部初始化顺序为:

1.  父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行

2.  子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行

3.  父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行

4.  父类构造方法

5.  子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行

6.  子类构造方法

备注:java内部静态类也是在调用时初始化,和静态方法是一致的!所以内部静态类的静态变量也是在调用时初始化的!

原文地址:https://www.cnblogs.com/iusmile/p/2679089.html