首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 方法參數 final 與區域內部類:為何要 final?匿名類別捕獲區域變數的機制

     編輯:程式設計綜合問答

final 修飾參數/區域變數的目的

**允許匿名內部類別 / Lambda 存取該變數**。Java 規定:匿名類別只能存取 **final 或 effectively final (實際上不再變更)** 的區域變數/參數。

底層機制

  • 匿名類別編譯後成為獨立 class,無法直接存取外部方法的堆疊框架變數。
  • 編譯器將被捕獲的變數**複製**為匿名類別的 **實例欄位** (若為物件參考則複製參考值)。
  • 若原變數後續可變更,複製的值會過期,導致邏輯不一致。final 保證變數指向不變,複製安全。

範例

public void test() {
    final String prefix = "LOG: ";  // 必須 final 或 effectively final
    Runnable r = () -> System.out.println(prefix + "done"); // 捕獲 prefix
    new Thread(r).start();
}

內部類別分類與應用場景

類型定義位置典型用途
成員內部類類別內、方法外需存取外部類私有欄位、邏輯強相關 (如 Map.Entry)
靜態巢狀類類別內、方法外 + static不需外部實例、工具類、Builder 模式
區域內部類方法內實作介面一次性邏輯、封裝演算法細節
匿名類別方法內、表達式中事件監聽、Runnable、Comparator 等一次性實作

實戰範例:方法內匿名類別實作 Comparator

public void sortByLength(List list) {
    list.sort(new Comparator() {
        @Override public int compare(String a, String b) {
            return a.length() - b.length();
        }
    });
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved