亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編譯時常量和變量

編譯時常量和變量

白板的微信 2019-12-21 11:23:08
Java語言文檔說:如果將原始類型或字符串定義為常量,并且在編譯時知道該值,則編譯器會使用其值替換代碼中各處的常量名稱。這稱為編譯時常量。我的理解是,如果我們有一段代碼:private final int x = 10;然后,編譯器會將x代碼中每次出現的內容替換為literal 10。但假設常量在運行時初始化:private final int x = getX(); // here getX() returns an integer value at run-time.與編譯時常數相比,性能是否會下降(無論可以忽略不計)?另一個問題是下面的代碼行:private int y = 10; // here y is not final被編譯器以與編譯時常量相同的方式處理?最后,我從答案中了解到的是:final static 表示編譯時常數只是final意味著它是一個常量,但是在運行時初始化只是static意味著在運行時初始化沒有final是變量,不會被視為常量。我的理解正確嗎?
查看完整描述

3 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

編譯時間常數必須為:

  • 宣布最終

  • 原始或字符串

  • 在聲明中初始化

  • 用常量表達式初始化

所以private final int x = getX();不是恒定的。

第二個問題private int y = 10;不是恒定的(在這種情況下是非最終的),因此優化器無法確定該值將來不會更改。因此,它無法將其優化為恒定值。答案是:不,它與編譯時間常數的處理方式不同。


查看完整回答
反對 回復 2019-12-21
?
犯罪嫌疑人X

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變量在技術上應稱為變量。


查看完整回答
反對 回復 2019-12-21
?
哆啦的時光機

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節)。


查看完整回答
反對 回復 2019-12-21
  • 3 回答
  • 0 關注
  • 835 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號