1. 程式人生 > >java 類載入過程中static final 的特殊

java 類載入過程中static final 的特殊

程式設計過程中經常用的static,final關鍵字,也經常聽到同事談起這些詞,到底他們怎麼樣呢,jvm中class類檔案結構可以找到答案。

ConstantValue屬性

ConstantValue屬性的作用是通知虛擬機器自動為靜態變數賦值,只有被static修飾的變數才可以使用這項屬性。非static型別的變數的賦值是在例項構造器方法中進行的;tatic型別變數賦值分兩種,在類構造其中賦值,或使用ConstantValue屬性賦值。

在實際的程式中,只有同時被final和static修飾的欄位才有ConstantValue屬性,且限於基本型別和String。編譯時Javac將會為該常量生成ConstantValue屬性,在類載入的準備階段虛擬機器便會根據ConstantValue為常量設定相應的值,如果該變數沒有被final修飾,或者並非基本型別及字串,則選擇在類構造器中進行初始化。

為什麼ConstantValue的屬性值只限於基本型別和string?
  • 1

因為從常量池中只能引用到基本型別和String型別的字面量

final、static、static final修飾的欄位賦值的區別
  • 1
  • static修飾的欄位在載入過程中準備階段被初始化,但是這個階段只會賦值一個預設的值(0或者null而並非定義變數設定的值)初始化階段在類構造器中才會賦值為變數定義的值。
  • final修飾的欄位在執行時被初始化,可以直接賦值,也可以在例項構造器中賦值,賦值後不可修改。
  • static final修飾的欄位在javac編譯時生成comstantValue屬性,在類載入的準備階段直接把constantValue的值賦給該欄位。 
    可以理解為在編譯期即把結果放入了常量池中。