前言
最近被這個概念迷惑住瞭,翻看中文博客大多沒有講的太清楚,最後多方查閱終於搞清楚,特此記錄,希望對別人有幫助。
編譯時常量定義是否一定需要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運算符和任何方法調用的表達式(註:常量表達式可以是常量的引用)。