面試的時候,經常會遇到這樣的筆試題:給你兩個類的代碼,它們之間是繼承的關系,每個類裡只有構造器方法和靜態塊,它們只包含一些簡單的輸出字符串到控制台的代碼,然後讓我們寫出正確的輸出結果。這實際上是在考察我們對於類的初始化知識的了解。
首先,我們先看看下面的代碼,這就是很經典的考察方式。
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程序所使用。類型的生命周期如下圖所示:
裝載和連接必須在初始化之前就要完成。