1. 程式人生 > 實用技巧 >訪問類的靜態屬性與類的初始化

訪問類的靜態屬性與類的初始化

訪問類的靜態屬性與類的初始化


驗證

現有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虛擬機器》學習筆記