java 類載入過程中static final 的特殊
阿新 • • 發佈:2019-01-25
程式設計過程中經常用的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的值賦給該欄位。
可以理解為在編譯期即把結果放入了常量池中。