在http://blog.csdn.net/xdugucc/article/details/78217098这篇博文中对单个类成员变量初始化和构造器初始化顺序做了介绍。
而这篇将讲解具有继承关系的类中的初始化顺序。
一个类中具有静态成员和静态代码块,非静态成员和非静态代码块,构造器这些需要初始化的东西。现在他有一个父类。那么当生成一个子类对象时,必然需要对父类中需要初始化的东西进行初始化。顺序如下:
(如果静态成员和静态代码块还未初始化过)
1.父类静态成员和静态代码块
2.子类静态成员和子类静态代码块
3.父类非静态成员和非静态代码块
4.父类构造器
5.子类非静态成员和子类非静态代码块
6.子类构造器
来看一个例子吧,改编自Thinking in java.
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
System.out.println("Table()");
}
Bowl bowl2 = new Bowl(2);
}
class Cupboard extends Table{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("cupboard()");;
}
}
public class StaticInitializationWithExtention {
public static void main(String[] args) {
new Cupboard();
}
}
/**output:
* bow(1)
* bow(4)
* bow(2)
* table()
* bow(3)
* cuoboard()
*/
根据所说的初始化顺序应该能很快得出正确的结果。