在 Java 中,final 意為「最終的、不可變的」。它可以修飾變量(成員/局部)、方法、類,語義雖有差異,但核心都是限制修改/繼承/重寫,並為 JVM 優化提供契機。
final int MAX = 100; // MAX = 200; 編譯錯誤final List list = new ArrayList<>();
list.add("hello"); // ✅ 合法:修改對象內容
// list = new LinkedList<>(); // ❌ 編譯錯誤:嘗試改變引用指向
static final 常量:通常大寫命名,編譯期常量折疊優化。public static final double PI = 3.14159;void process(final User user) {
// user = new User(); // ❌ 編譯錯誤
user.setName("New"); // ✅ 合法:修改對象狀態
}
用途:防止在方法內意外修改參數引用,提高代碼可讀性與安全性(特別是匿名內部類/Lambda 捕獲變量時必須 final 或 effectively final)。
public class BaseService {
// 核心業務邏輯,不允許子類修改
public final void criticalOperation() {
// ...
}
}
class SubService extends BaseService {
// @Override public void criticalOperation() {} // ❌ 編譯錯誤
}
private)隱式 final,同樣享受此優化。public final class ImmutableString { // 如 String、Integer、Long
// 所有方法隱式 final
}
final。private final。優勢:線程安全、可自由共享、天然適合作為 Map Key/Set 元素、簡化並發編程。
| 概念 | 說明 |
|---|---|
| final vs finally | final 修飾符;finally 異常處理塊 |
| final vs finalize() | finalize() 是 Object 方法,GC 前調用(已棄用) |
| 接口字段 | 隱式 public static final |
| final + abstract | 互斥:final 類不能是 abstract |
| 編譯期常量折疊 | static final 基本類型/字符串常量編譯期內聯 |
| Effectively Final | Java 8+:未聲明 final 但實際未重新賦值的局部變量,可用於 Lambda |
final。public static final 全大寫下劃線分隔(MAX_CONNECTIONS)。final;不想被繼承的類加 final(如工具類、實體類)。