static final的初始化與賦值問題
1.Class 檔案的生成階段
Sun javac編譯器對於靜態field欄位的初始化賦值策略
目前的Sun javac編譯器的選擇是:
1.如果使用final和static同時修飾一個field欄位,並且這個欄位是基本型別或者String型別的,那麼編譯器在編譯這個欄位的時候,會在對應的field_info結構體中增加一個ConstantValue型別的結構體,在賦值的時候使用這個ConstantValue進行賦值;
2.如果該field欄位並沒有被final修飾,或者不是基本型別或者String型別,那麼將在類構造方法cinit>()中賦值。
對於上述的public static final init MAX=100; javac編譯器在編譯此field欄位構建field_info結構體時,除了訪問標誌、名稱索引、描述符索引外,會增加一個ConstantValue型別的屬性表。
2.類載入階段(連結(準備階段))
如果類欄位的欄位屬性表中存在ConstantValue屬性,即同時被final和static修飾,那麼在準備階段變數value就會被初始化為ConstValue屬性所指定的值。 假設上面的類變數value被定義為: public static final int value = 3; 編譯時Javac將會為value生成ConstantValue屬性,在準備階段虛擬機器就會根據ConstantValue的設定將value賦值為3。
順便講一句:static final 與final static 只是使用的習慣問題 ,沒有 差別