3 回答

TA貢獻1712條經驗 獲得超3個贊
編譯時間常數必須為:
宣布最終
原始或字符串
在聲明中初始化
用常量表達式初始化
所以private final int x = getX();
不是恒定的。
第二個問題private int y = 10;
不是恒定的(在這種情況下是非最終的),因此優化器無法確定該值將來不會更改。因此,它無法將其優化為恒定值。答案是:不,它與編譯時間常數的處理方式不同。

TA貢獻2080條經驗 獲得超4個贊
該JLS使得之間的區別如下final變量和常量:
final 變數
可以聲明一個變量final。甲final變量可以僅被分配給一次。如果將final變量賦值給它,則是編譯時錯誤,除非在賦值之前絕對未賦值(第16節(確定賦值))。
一旦一個final變量被分配,它總是包含相同的值。如果final變量持有對對象的引用,則可以通過對對象的操作來更改對象的狀態,但是變量將始終引用同一對象。這也適用于數組,因為數組是對象。如果final變量持有對數組的引用,則可以通過對數組的操作來更改數組的組件,但是變量將始終引用同一數組。
一個空白的final是一個final變量,其聲明中缺少一個初始化。
常數
甲常量變量是final原始類型或類型的變量 String,其與一個常量表達式(初始化§15.28)。
從這個定義中,我們可以看出一個常數必須是:
宣告 final
原始類型或類型 String
在其聲明中初始化(不是空白final)
用常量表達式初始化
編譯時常量呢?
該JLS不包含短語編譯時間常數。但是,程序員經常將術語“ 編譯時常量”和“ 常量常量”互換使用。
如果final變量不滿足上述標準,則該final變量在技術上應稱為變量。

TA貢獻1779條經驗 獲得超6個贊
根據JLS,沒有要求“常量”應該是靜態的。
因此,“常量”可以是靜態的也可以是非靜態的(實例變量)。
但是JLS對變量成為“常量變量”(除了只是最終變量)施加了一些其他要求:
僅是字符串或原始
僅初始化為內聯,因為它是最終的,并且不允許空白的最終
用“常量表達式” =“編譯時常量表達式”初始化(請參見下面的JLS引用)
4.12.4。最終變量(JLS)
甲常量變量是原語類型的最終變量或輸入與一個常量表達式初始化字符串(§15.28) 。
15.28。常數表達式
甲編譯時間常量表達式是表示原始類型或String不突然完成,并且僅使用以下組成的一個值的表達式:
基本類型的文字和字符串類型的文字(§3.10.1,§3.10.2,§3.10.3,§3.10.4,§3.10.5)
強制轉換為基本類型,強制轉換為字符串(第15.16節)
一元運算符+,-,?和?。ǖ皇?+或-)(§15.15.3,§15.15.4,§15.15.5,§15.15.6)
乘法運算符*,/和%(第15.17節)
加法運算符+和-(§15.18)
移位運算符<<,>>和>>>(第15.19節)
關系運算符<,<=,>和> =(但不包括instanceof)(第15.20節)
等號運算符==和!=(§15.21)
按位和邏輯運算符&,^和| (§15.22)
條件和運算符&&和條件或運算符|| (§15.23,§15.24)
三元條件運算符?:(§15.25)
帶括號的表達式(第15.8.5節),其包含的表達式是一個常量表達式。
引用常量變量(第4.2.4節)的簡單名稱(第6.6.5.6.1節)。
TypeName形式的合格名稱(第6.5.6.2節)。引用常量變量的標識符(第4.12.4節)。
添加回答
舉報