| 修飾對象 | 含義 | 關鍵規則 |
|---|---|---|
| 變數 (欄位/區域/參數) | 引用不可變更 | 基本型別:值不可變;引用型別:地址不可變,但物件內容可變 |
| 方法 | 不可被覆寫 | 防止子類改變核心邏輯,允許重載 |
| 類別 | 不可被繼承 | 如 String, Integer, LocalDate;final 類方法隱含 final |
final int MAX_SIZE = 100;
// MAX_SIZE = 200; // 編譯錯誤
final List list = new ArrayList<>();
list.add("A"); // 合法:修改物件內容
// list = new LinkedList<>(); // 編譯錯誤:改變引用指向
final int[] arr = {1,2,3};
arr[0] = 99; // 合法
// arr = new int[5]; // 編譯錯誤
public class Constants {
public static final double PI = 3.141592653589793;
public static final String APP_NAME = "MyApp";
// 編譯期常數:基本型別 + String + 字面值運算 → 編譯器內聯到呼叫處
}
static final 欄位在類初始化時賦值,佔據固定記憶體位置,所有實例共享。若值為編譯期常數,編譯器會將其內聯到使用處(如 Constants.PI 直接變為 3.14...),修改常數值需重新編譯所有依賴模組。
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 必須捕獲 final 區域變數
final String label = "Clicked";
System.out.println(label);
}
});
JDK 8+ 引入 Effectively Final:區域變數若實際上未重新賦值,無需顯式 final 即可在 Lambda/匿名類中使用。
final 方法:核心演算法模板、安全敏感操作、效能關鍵路徑(JIT 內聯優化)。final 類:不可變物件、工具類、安全敏感類(String, wrapper types)。final List list = new ArrayList(); list.add(1); 完全合法。public abstract,不可為 final(Java 8+ default/static 方法除外)。final 是語意契約:對編譯器承諾「這不會變」,換取編譯期檢查、JIT 優化與程式碼可讀性。善用 static final 定義常數,final 參數防誤賦值,final 方法/類表達設計意圖。記住:final 保護的是引用,不是物件內容。