Java中靜態常量和靜態變數的區別
阿新 • • 發佈:2019-01-24
如下:測試java中靜態常量和靜態變數區別的樣例,表明兩者載入時的區別。
StaticClass類中定義了靜態常量FIANL_VALUE和靜態變數VALUE,靜態程式碼塊的列印語句表示類被載入:
- publicclass StaticClass {
- static {
- System.out.println("StaticClass loading...");
- }
- publicstatic String VALUE = "static value loading";
- publicstaticfinal String FIANL_VALUE = "fianl value loading"
- }
StaticClassLoadTest類用於測試靜態變數的載入:
- publicclass StaticClassLoadTest {
- publicstaticvoid main(String[] args) {
- System.out.println("StaticClassLoadTest...");
- printStaticVar();
- }
- privatestaticvoid printStaticVar() {
- System.out.println(StaticVar.FIANL_VALUE);
- System.out.println(StaticVar.VALUE);
- }
- }
輸出:
- StaticClassLoadTest...
- fianl value loading
- StaticClass loading...
- static value loading
輸出顯示在列印靜態常量時,StaticVar類並沒有被載入,在輸出靜態變數的前才打印類載入資訊。這表明類的未載入的情況下也能引用其靜態常量資訊,原因是因為常量值儲存在JVM記憶體中的常量區中,在類不載入時即可訪問。
注:經過編譯優化,靜態常量 FIANL_VALUE 已經存到NotInit類自身常量池中,不會載入StaticClass
但是不能說所有的靜態常用訪問都不需要類的載入,這裡還要判斷這個常量是否屬於“編譯期常量”,即在編譯期即可確定常量值。如果常量值必須在執行時才能確定,如常量值是一個隨機值,也會引起類的載入,如下:
- publicstaticfinalint FINAL_VALUE_INT = new Random(66).nextInt();