工作有三年之久了,突然感觉带有继承关系、父子俩既有静态变量又有成员变量的情况,变量的加载顺序很容易混淆,今晚写了个例子,总算是把关系搞清楚了
例子中,父类既有普遍的成员变量,也有static变量,也有static代码块,在父类的构造器前后都有static变量及普通变量,让我们看看初始化子类的时候会发生什么吧
先提供完整代码:
LoadSequence.java
public classLoadSequence {public static voidmain(String[] args) {newLsSon();
}
}classPrintObj {publicPrintObj(String str) {
System.out.println(str);
}
}classLsFather {static PrintObj po1 = new PrintObj("LsFather static new 1 ");
PrintObj po2= new PrintObj("LsFather new 2 ");static{
System.out.println("LsFather static");
}publicLsFather() {
System.out.println("LsFather()");
}
}class LsSon extendsLsFather {static PrintObj po3 = new PrintObj("LsSon static new 3 ");
PrintObj po4= new PrintObj("LsSon new 4 ");static{
System.out.println("LsSon static");
}publicLsSon() {
System.out.println("LsSon()");
}static PrintObj po5 = new PrintObj("LsSon static new 6 ");
PrintObj po6= new PrintObj("LsSon new 6 ");
}
View Code
执行结果如下:
LsFather static new 1
LsFather static
LsSon static new 3
LsSon static
LsSon static new 6
LsFather new 2
LsFather()
LsSon new 4
LsSon new 6
LsSon()
由于可知:
带有继承关系的,实例化子类时,加载顺序如下:
父类static标识的代码,按顺序自上而下全部执行 -> 子类static标识的代码,按顺序自上而下全部执行
->父类成员变量加载 -> 父类构造函数 -> 子类成员变量加载 -> 子类构造函数