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

Java 匿名內部類:不僅是參數列表中 new 接口/抽象類

     編輯:程式設計疑難解答

核心定義

匿名內部類是沒有名字的內部類,語法形式為:

new 父類類型/接口類型(參數列表) {
    // 類體:實現抽象方法、重寫方法、定義新成員
}

它隱式繼承指定父類或隱式實現指定接口,並當場創建實例。

典型應用場景

1. 方法參數傳遞(最常見)

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 處理點擊邏輯
    }
});

2. 直接賦值給變量

Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("異步任務執行");
    }
};
executor.execute(task);

3. 返回值

public Comparator getComparator() {
    return new Comparator() {
        @Override
        public int compare(String o1, String o2) {
            return o1.length() - o2.length();
        }
    };
}

關鍵特性

  • 隱式 final:匿名類引用的外部局部變量必須是 final 或實際上不變(Java 8+ 隱式 final)
  • 無構造函數:不能定義構造函數,但可用實例初始化塊 { ... } 完成初始化
  • 可訪問外部類成員:包括私有成員
  • 類名為編譯器生成:如 OuterClass$1.class

Java 8+ 的現代替代:Lambda 表達式

對於函數式接口(單一抽象方法),Lambda 更簡潔:

// 匿名內部類
executor.execute(new Runnable() {
    @Override public void run() { System.out.println("Hi"); }
});

// Lambda
executor.execute(() -> System.out.println("Hi"));

但匿名內部類仍適用於:需實現多個方法、需繼承類而非接口、需在類體中定義輔助字段/方法等場景。

總結

匿名內部類不僅用於參數列表,本質是即時定義並實例化一個一次性類。理解其語法本質與捕獲變量規則,配合 Lambda 靈活選擇,是 Java 開發進階關鍵。

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