String、Integer。public class FinalDemo {
final double PI = 3.14; // 1. 宣告時直接賦值
final int i; // 2. 或在建構子中賦值(必須所有建構子都初始化)
final List list; // 3. 引用型別同樣適用
FinalDemo() { i = 100; list = new ArrayList<>(); }
FinalDemo(int i) { this.i = i; list = new LinkedList<>(); }
}
編譯器強制檢查:若建構子未初始化 final 欄位,編譯報錯。
final int COMPILE_CONST = 100; // 編譯期常量,內聯優化
final int RUNTIME_CONST = new Random().nextInt(10); // 運行期賦值
static final int STATIC_CONST = 999; // 類載入時初始化,佔用固定記憶體
static final + 基本型別/String = 編譯期常量,會被編譯器內聯到調用處。final List list = new ArrayList<>();
list.add("hello"); // ✅ 合法:修改物件內容
// list = new LinkedList<>(); // ❌ 編譯錯誤:嘗試改變引用指向
final int[] arr = {1,2,3};
arr[0] = 10; // ✅ 合法:修改陣列元素
// arr = new int[5]; // ❌ 編譯錯誤
// ❌ 危險:外部可修改內部陣列
public class Dangerous {
public final String[] states = {"AL", "AK"};
public String[] getStates() { return states; }
}
// ✅ 安全:返回不可變視圖或複製品
public class Safe {
private final String[] states = {"AL", "AK"};
public List getStates() {
return Collections.unmodifiableList(Arrays.asList(states));
}
}
final:防止在方法內意外修改參數引用(基本型別傳值無影響,引用型別防止指向新物件)。private 方法隱含 final(不可見自然不可覆寫)。static 方法屬於類,不參與覆寫機制,但可被子類隱藏。| 關鍵字 | 用途 | 屬於 |
|---|---|---|
| final | 修飾類/方法/變數,表示不可變/不可繼承/不可覆寫 | 修飾符 |
| finally | 異常處理塊,無論是否拋出異常都會執行(除非 JVM 退出) | 控制流語句 |
| finalize() | Object 方法,GC 回收前調用(已棄用,Java 9+ 不推薦使用) | Object 方法 |
final 修飾不需變更的欄位、參數,提升可讀性與線程安全。final class。final 修飾引用,配合 Collections.unmodifiableXxx 或防禦性複製保護內部狀態。final 修飾方法/類,除非有明確設計意圖(如模板方法模式中的核心步驟)。