static final、編譯期可知值 → 編譯器內聯常數值。final 字段在構造器/初始化塊賦值,之後不可改。| 類型 | final 效果 |
|---|---|
| 基本類型 | 值不可變(真常數) |
| 引用類型 | 引用不可變(指向固定對象),但對象內容可變 |
class Value { int i = 1; }
public class FinalData {
final int i1 = 9; // 編譯期常數
static final int I2 = 99; // 編譯期常數
public static final int I3 = 39; // 標準常量定義
final int i4 = (int)(Math.random()*20); // 運行期初始化
static final int i5 = (int)(Math.random()*20); // 類加載時初始化一次
Value v1 = new Value();
final Value v2 = new Value(); // 引用不可變
static final Value v3 = new Value();
final int[] a = {1,2,3,4,5,6}; // 數組引用不可變,元素可改
void print() { println("i4=" + i4 + ", i5=" + i5); }
}
fd1: i4 = 15, i5 = 9 Creating new FinalData fd1: i4 = 15, i5 = 9 ← i4 不變(對象級),i5 不變(類級) fd2: i4 = 10, i5 = 9 ← 新對象 i4 不同,i5 同
聲明 final 但不立即賦值,**必須在構造器中初始化**(每個構造器都要)。
class BlankFinal {
final int i = 0; // 顯式初始化
final int j; // 空白 final
final Poppet p; // 空白 final 引用
BlankFinal() { j = 1; p = new Poppet(); }
BlankFinal(int x) { j = x; p = new Poppet(); }
}
編譯器強制檢查所有構造路徑均初始化了空白 final。
void with(final Gizmo g) { g.spin(); } // g 不可重新賦值
int g(final int i) { return i + 1; } // 基本類型只讀
final:不可指向新對象,可調用方法修改對象內容。final:不可修改值。final(Java 8+ 實際 final 即可)。