1. 程式人生 > >Java中靜態常量和靜態變數的區別

Java中靜態常量和靜態變數的區別

如下:測試java中靜態常量和靜態變數區別的樣例,表明兩者載入時的區別。

StaticClass類中定義了靜態常量FIANL_VALUE和靜態變數VALUE,靜態程式碼塊的列印語句表示類被載入:

  1. publicclass StaticClass {  
  2.     static {  
  3.         System.out.println("StaticClass loading...");  
  4.     }  
  5.     publicstatic String VALUE = "static value loading";  
  6.     publicstaticfinal String FIANL_VALUE = "fianl value loading"
    ;  
  7. }  

StaticClassLoadTest類用於測試靜態變數的載入:
  1. publicclass StaticClassLoadTest {  
  2.     publicstaticvoid main(String[] args) {  
  3.         System.out.println("StaticClassLoadTest...");  
  4.         printStaticVar();  
  5.     }  
  6.     privatestaticvoid printStaticVar() {  
  7.         System.out.println(StaticVar.FIANL_VALUE);  
  8.         System.out.println(StaticVar.VALUE);  
  9.     }  
  10. }  

輸出:

  1. StaticClassLoadTest...
  2. fianl value loading 
  3. StaticClass loading...  
  4. static value loading 

輸出顯示在列印靜態常量時,StaticVar類並沒有被載入,在輸出靜態變數的前才打印類載入資訊。這表明類的未載入的情況下也能引用其靜態常量資訊,原因是因為常量值儲存在JVM記憶體中的常量區中,在類不載入時即可訪問。

注:經過編譯優化,靜態常量 FIANL_VALUE 已經存到NotInit類自身常量池中,不會載入StaticClass


但是不能說所有的靜態常用訪問都不需要類的載入,這裡還要判斷這個常量是否屬於“編譯期常量”,即在編譯期即可確定常量值。如果常量值必須在執行時才能確定,如常量值是一個隨機值,也會引起類的載入,如下:

  1. publicstaticfinalint FINAL_VALUE_INT = new Random(66).nextInt();