Intro Java final
Intro Java final
Intro Java final
Intro Java final
Java final 修飾字用法詳解
final 是 Java 中的關鍵字,用來限制修改,根據使用位置有不同含義:
修飾變數 (Variables)
基本類型變數
final int x = 10;
// x = 20; // 編譯錯誤!不能重新賦值
物件參考
final Listlist = new ArrayList<>();
list.add(“Hello”); // ✅ 可以修改物件內容
// list = new ArrayList<>(); // ❌ 不能重新賦值參考
類別成員變數
public class Example {
final int CONSTANT = 100; // 必須在宣告時初始化
final String name;// 或在建構子中初始化
public Example(String name) {
this.name = name;
}
}
方法參數
public void method(final int param) {
// param = 5; // 編譯錯誤!
System.out.println(param);
}
- 修飾方法 (Methods)
public class Parent {
final void cannotOverride() {
System.out.println(“此方法不能被覆寫”);
}
}
public class Child extends Parent {
// void cannotOverride() { } // 編譯錯誤!
}
- 修飾類別 (Classes)
final class CannotExtend {
// 此類別不能被繼承
}
// class Child extends CannotExtend { } // 編譯錯誤!
著名例子:
String 類別是 final
所有包裝類別 (Integer, Double 等) 都是 final
常見使用模式
常數定義
public static final String API_URL = “https://api.example.com“;
public static final int MAX_RETRY = 3;
不可變物件設計
public final class ImmutablePerson {
private final String name;
private final int age;public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}public String getName() { return name; }
public int getAge() { return age; }
// 沒有 setter 方法
}
Lambda 表達式中的變數捕獲
int x = 10; // 實際上是 final (effectively final)
list.forEach(item -> System.out.println(item + x));
效能考量
final 變數可能有輕微效能優化
編譯器可以進行更好的最佳化
有助於 JVM 的內聯優化最佳實務
✅ 建議使用:
對不需要修改的變數使用 final
工具類別標記為 final
不希望被覆寫的方法標記為 final
✅ 好處:
提高程式碼可讀性
防止意外修改
編譯時期錯誤檢查
執行緒安全的保證(對於不可變物件)
這樣使用 final 可以讓程式碼更加安全和清晰!