最近看到一个面试题,是关于java的初始化顺序的。特意记录下来:

public class O { public O(String s) { System.out.println(s); } } public class A { private O t2 = new O("父类实例变量1"); private static O t3 = new O("父类静态变量"); public A() { O t4 = new O("父类构造函数"); } private O t5 = new O("父类实例变量2"); } public class B extends A { private O t6 = new O("子类实例变量1"); private static O t7 = new O("子类静态变量"); public B() { O t8 = new O("子类构造函数"); } private O t9 = new O("子类实例变量2"); public static void main(String[] args) { B b1 = new B(); System.out.println("====================================="); B b2 = new B(); } }

 

一些论坛或者blog已经给出了答案。

http://stackoverflow.com/questions/2007666/in-what-order-do-static-initializer-blocks-in-java-run

http://java.chinaitlab.com/base/754921.html


看这个程序的结果就一目了然了。


父类静态变量
子类静态变量
父类实例变量1
父类实例变量2
父类构造函数
子类实例变量1
子类实例变量2
子类构造函数
=====================================
父类实例变量1
父类实例变量2
父类构造函数
子类实例变量1
子类实例变量2
子类构造函数