分析 Java Compile-time Constant(編譯時常量)問題

前言

最近被這個概念迷惑住瞭,翻看中文博客大多沒有講的太清楚,最後多方查閱終於搞清楚,特此記錄,希望對別人有幫助。

編譯時常量定義是否一定需要static修飾?

如果你看別人寫的編譯時常量例子,很多人都會這樣定義:

public static final int variale = 1;

那麼這裡的static是否為必需的呢?

其實,final為必需,static為非必需。如果你懂得瞭編譯器對編譯時常量的處理,就會知道final為必需是有原因的,而static並沒有什麼特殊原因一定要寫。

編譯器對於檢測到的編譯時常量進行這樣的處理:將所有出現該編譯時常量的地方直接替換為該變量聲明時賦給的值。

final int var = 1; //compile-time constant

int another = var; //等效於int another = 1;

那麼要求用final修飾的意義就很明顯瞭。如果不用final修飾,變量在程式後續部分改變瞭它最初的值,但是編譯器這時候早已將所有出現該變量的地方替換為它最初的值,那麼該變量值的改變便是無意義的。

int var = 1; //假設var為編譯時常量
int another = var;
var = 2;
int another1 = var; //程式員原意這裡應該為another1 = 2;
/*如果var按編譯時常量處理,上述代碼等效於*/
int var = 1;
int another = 1;
var = 2;
int another1 = 1;

變量成為編譯時常量的四個條件

使用final修飾 變量必須為基本類型或String類型 變量必須在聲明的同時進行賦值 對變量進行賦值的必須為常量表達式(constant expression)

常量表達式(Constant expression)

對於常量表達式,你可以這樣快速記憶:它是一個不包括自增自減運算符,不包括instanceof運算符和任何方法調用的表達式(註:常量表達式可以是常量的引用)。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *