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内部静态类也是在调用时初始化,和静态方法是一致的!所以内部静态类的静态变量也是在调用时初始化的!