面試的時候,經常會遇到這樣的筆試題:給你兩個類的代碼,它們之間是繼承的關系,每個類裡只有構造器方法和靜態塊,它們只包含一些簡單的輸出字符串到控制台的代碼,然後讓我們寫出正確的輸出結果。這實際上是在考察我們對於類的初始化知識的了解。
首先,我們先看看下面的代碼,這就是很經典的考察方式。
public class InitField {
public static void main(String[] args) {
SuperInitField p = new SuperInitField();
SuperInitField c = new SubInitField();
}
}
class SuperInitField {
public SuperInitField() {
System.out.println("parent");
}
static {
System.out.println("static parent");
}
}
class SubInitField extends SuperInitField {
public SubInitField() {
System.out.println("child");
}
static {
System.out.println("static child");
}
}
不管你是否能很快速的寫出正確的答案,我們先把這個程序放一邊,了解一下Java虛擬機初始化的原理。
JVM通過加裝、連接和初始化一個Java類型,使該類型可以被正在運行的Java程序所使用。類型的生命周期如下圖所示:
裝載和連接必須在初始化之前就要完成。