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

Java 監聽器參數為何可以 new 接口?匿名內部類機制解析

     編輯:程式設計綜合問答

現象

new Thread(new Runnable() {
    @Override public void run() { ... }
}).start();

`Runnable` 是介面,為何可以 `new Runnable()`?

本質:匿名內部類

  • `new Runnable() { ... }` **不是實例化介面**,而是**定義並實例化一個實現了該介面的匿名類別**。
  • 編譯器會產生一個類別(如 `OuterClass$1`),實現 `Runnable`,並將大括號內的方法作為該類別的方法實現。
  • JVM 在運行時看到的是一個具體類別的實例,完全符合類別實例化語義。

語法糖等價代碼

// 編譯器生成的隱含類別
class OuterClass$1 implements Runnable {
    final OuterClass this$0;
    OuterClass$1(OuterClass outer) { this$0 = outer; }
    @Override public void run() { /* 方法體 */ }
}

// 使用時
new Thread(new OuterClass$1(this)).start();

適用場景

  • 函數式介面(單一抽象方法)配合 Lambda 表達式更簡潔:`new Thread(() -> { ... }).start();`(Java 8+)。
  • 事件監聽器、比較器、執行緒任務等一次性行為定義。

關鍵點

  1. 介面本身不可實例化,但**實現介面的類別可以**。
  2. 匿名內部類**隱式持有外部類引用**,注意記憶體洩漏風險(如長生命週期監聽器持有 Activity)。
  3. Java 8+ 優先使用 Lambda,語義更清晰、字節碼更輕量(invokedynamic)。

理解「介面類型變量指向實現類實例」的多態本質,`new Interface() { ... }` 就不再神秘。

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