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

Java 匿名內部類本質揭秘:`new Father(){...}` 究竟創建了什麼?

     編輯:程式設計綜合問答

現象困惑

初學者常見疑問:new Father(){ ... } 明明是 new 一個對象,為什麼說生成了「匿名類」?小括號後跟大括號是什麼意思?

核心真相

new Father(){ ... } 的執行過程分兩步:

  1. 隱式定義一個繼承自 Father 的無名類(匿名內部類),大括號內是該類的類體(字段、方法、初始化塊)。
  2. 實例化該匿名類,返回其對象引用。

等價展開代碼

// 匿名內部類寫法
Father f1 = new Father() {
    @Override
    public void abstractMethod() { ... }
    // 可添加新字段、方法
};

// 等價於顯式定義實現類
class FatherImpl extends Father {
    @Override
    public void abstractMethod() { ... }
}
Father f1 = new FatherImpl();

為什麼需要匿名內部類?

  • 就地實現接口/抽象類:避免為一次性使用創建獨立類文件(如事件監聽器、Runnable、Comparator)。
  • 捕獲外部上下文:可直接訪問外部方法的 final 或 effectively final 變量,形成閉包效果。
  • Lambda 表達式的前身:Java 8+ 推薦用 () -> { ... } 替代單方法接口(函數式接口)的匿名類,更簡潔、性能更好(invokedynamic)。

關鍵語法規則

  • 只能繼承一個類或實現一個接口(隱式)。
  • 無構造函數,但可用實例初始化塊 { ... } 完成初始化邏輯。
  • 編譯後生成 OuterClass$1.class、OuterClass$2.class 等文件。

總結

new 接口/類() { 類體 } = 定義子類/實現類 + 實例化 的語法糖。理解這一點,閱讀舊代碼、遷移至 Lambda、排查類加載問題將不再困惑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved