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

Java 匿名內部類詳解:new Interface() 後跟大括號實現接口方法的語法糖

     編輯:程式設計疑難解答

代碼現場

interface Inter {
    public abstract void show();
}

class Outer {
    public void method() {
        new Inter() { // 這裡 new 接口名?
            public void show() {
                System.out.println("show");
            }
        };
    }
}

核心解析

這不是實例化接口(接口無法實例化),而是定義並實例化一個實現該接口的匿名內部類。

語法結構

new InterfaceName() {
    // 類體:實現接口所有抽象方法
    // 可訪問外部類 final/有效final 變量
};

編譯器生成

編譯器會生成一個隱式類(如 Outer$1.class),實現 Inter 接口,並在構造函數中捕獲外部上下文引用。

適用場景

  • 一次性使用,無需單獨命名類(如事件監聽器、Runnable、Comparator)。
  • 需要訪問外部方法的局部變量(Java 8+ 要求 effectively final)。

Java 8+ 改進:Lambda 表達式

// 函數式接口(單一抽象方法)可簡寫為
Runnable r = () -> System.out.println("show");
// 等價於
new Runnable() { public void run() { System.out.println("show"); } }

注意事項

  1. 匿名類不能定義構造函數,但可用實例初始化塊 { ... }。
  2. 會持有外部類引用,可能導致內存洩漏(如長生命周期對象持有 Activity)。
  3. 序列化風險:匿名類隱式 serialVersionUID 不穩定,不建議序列化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved