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

Java 匿名內部類:new Interface() 實際上創建的是實現該介面的匿名類實例

     編輯:程式設計疑難解答

結論先行

正確。Java 中介面不能直接實例化,new MyInterface() { ... } 語法實際上是:隱式定義一個實現該介面的匿名類,並立即創建其實例。

字節碼層面證明

// 源碼
Runnable r = new Runnable() {
    public void run() { System.out.println("Hello"); }
};

// 編譯後生成兩個 class 文件
OuterClass.class
OuterClass$1.class   // 匿名類,實現 Runnable

反編譯 OuterClass$1.class 可見:

class OuterClass$1 implements Runnable {
    final OuterClass this$0;
    OuterClass$1(OuterClass outer) { this$0 = outer; }
    public void run() { System.out.println("Hello"); }
}

關鍵規則

  • 必須實現介面中**所有抽象方法**(Java 8+ 允許 default 方法不實現)。
  • 可訪問外部類 final 或實際上 final 的局部變數。
  • 匿名類隱式持有外部類實例引用(非 static 上下文),可能導致記憶體洩漏。

Lambda 表達式(Java 8+)的區別

// 函數式介面(單一抽象方法)可用 Lambda
Runnable r = () -> System.out.println("Hello");
// 編譯為 invokedynamic 指令,不生成匿名類 class 文件,效能更高

Lambda 非匿名類語法糖,而是利用 MethodHandle 動態生成實現類實例。

常見應用場景

  • 事件監聽器:button.addActionListener(e -> ...)
  • 執行緒任務:new Thread(() -> ...).start()
  • 比較器:list.sort((a,b) -> a.compareTo(b))
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved