訪問類的靜態屬性與類的初始化
阿新 • • 發佈:2020-06-27
訪問類的靜態屬性與類的初始化
驗證
現有SuperClass類,其原始碼如下:
public class SuperClass {
public static String staticVariable = "hello ";
public static final String STATIC_CONSTANT = "world!";
static {
System.out.println("SuperClass is loading.");
}
}
現有兩段程式碼,分別引用SuperClass類中的靜態屬性和靜態常量:
public class MainClass {
static {
System.out.println("MainClass is loading.");
}
public static void main(String[] args) {
System.out.println(SuperClass.staticVariable);//靜態屬性
}
}
public class MainClass { static { System.out.println("MainClass is loading."); } public static void main(String[] args) { System.out.println(SuperClass.STATIC_CONSTANT);//靜態常量 } }
上述兩段程式碼的執行結果分別如下:
(引用靜態屬性)
MainClass is loading.
SuperClass is loading.
hello
(引用靜態常量)
MainClass is loading.
world!
對比兩段程式碼的執行結果,可以看到對靜態常量的引用並沒有觸發常量所在類的初始化。
分析
雖然在Java原始碼中引用了SuperClass類的常量STATIC_CONSTANT,但是其實在編譯階段通過常量傳播優化,此常量的值"world!"已經被儲存到了MainClass類的常量池中,之後MainClass對SuperClass.STATIC_CONSTANT的引用,實際都被轉化為MainClass對自身常量池的引用了。也就是說,MainClass類的Class檔案中,並沒有SuperClass類的符號引用入口,MainClass類與SuperClass類在編譯成Class檔案以後就不存在任何聯絡了。
《深入理解Java虛擬機器》學習筆記