| 對象 | 含義 | 初始化時機 |
|---|---|---|
| 類 | 不可被繼承 | 定義時 |
| 方法 | 不可被重寫 | 定義時 |
| 變量 | 引用不可變 / 基本類型值不可變 | 靜態變量:靜態塊/聲明時 實例變量:構造器/實例塊/聲明時 局部變量:首次賦值前 |
final List list = new ArrayList<>();
list.add("hello"); // ✅ 合法:修改對象內部狀態
// list = new ArrayList<>(); // ❌ 編譯錯誤:改變引用指向
final int[] arr = {1, 2, 3};
arr[0] = 99; // ✅ 合法
// arr = null; // ❌ 編譯錯誤
結論:final 保護的是「引用地址不變」,不保護對象內容不變。不可變對象請用 Collections.unmodifiableList、Guava ImmutableList 或自定義不可變類。
public class FinalDemo {
// 靜態 final:聲明時或靜態塊
static final double PI = 3.14159;
static final String VERSION;
static { VERSION = "1.0.0"; }
// 實例 final:聲明時、實例塊、構造器
final String id = UUID.randomUUID().toString(); // 聲明時
final String name; // 構造器初始化
{ name = "default"; } // 實例塊初始化
public FinalDemo(String name) { this.name = name; }
// 局部 final:首次賦值前
void test() {
final int x;
x = 10; // 首次賦值
// x = 20; // 編譯錯誤
}
}
void stringInternDemo() {
final String a = "hello";
final String b = "world";
String c = "helloworld";
String d = a + b; // 編譯期常量折疊 → "helloworld"
System.out.println(c == d); // true
String e = "hello";
String f = "world";
String g = e + f; // 運行期拼接 → 新對象
System.out.println(c == g); // false
}
final 讓編譯器確定值,觸發 常量折疊,直接進入常量池,節省內存、提升比較性能。
final class:安全類、工具類、不可變類 —— 防止繼承破壞不變約束final method:模板方法模式中的骨架方法、核心算法 —— 保證邏輯不被竄改final classfinalCollections.unmodifiableXxx 返回視圖final 是 Java 中「意圖聲明」最強的關鍵字:不可變引用、不可繼承、不可重寫。正確使用能讓編譯器攔截大量運行時 Bug,讓代碼意圖一目瞭然。