首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 匿名內部類完整語法指南與實戰模式

     編輯:Java 相關知識

四大內部類速覽

  • 成員內部類
  • 靜態嵌套類
  • 方法內部類
  • 匿名內部類(本文重點)

語法本質:編譯器語法糖

匿名內部類編譯後會產生獨立 OuterClass$1.class、OuterClass$2.class...,本質等同於寫一個實作類再實例化,只是簡化了「定義類 → 實例化」兩步為一步。

三大核心使用模式

1. 實作介面

public interface IWriter { void write(); }

IWriter writer = new IWriter() {
    @Override public void write() { System.out.println("IWriter write..."); }
};
writer.write();

2. 繼承抽象類

public abstract class AbstractWriter { public abstract void write(); }

AbstractWriter aw = new AbstractWriter() {
    @Override public void write() { System.out.println("AbstractWriter write..."); }
};
aw.write();

3. 繼承具體類(覆寫方法)

public class TextWriter implements IWriter {
    @Override public void write() { System.out.print("text writer.."); }
}

TextWriter tw = new TextWriter() {
    @Override public void write() { System.out.println("TextWriter 2 write..."); }
};
tw.write();

實戰場景:執行緒與 Runnable

Thread t = new Thread() {
    @Override public void run() {
        new IWriter() {
            @Override public void write() { System.out.println("Thread write..."); }
        }.write();
    }
};
t.start(); // 注意:此處應用 start() 而非 run()

關鍵限制與注意事項

  • 無法定義建構子(無類別名稱),若需初始化邏輯請用實例初始化塊 { ... }。
  • 只能存取 final 或 effectively final 的區域變數(Java 8+ 自動判斷)。
  • 不可為 static,隱含持有外部類實例引用(非 static 內部類特性)。
  • 不可實作多個介面,只能單一繼承/實作。

Lambda 時代的替代關係

Java 8+ 若介面為函數式介面(單一抽象方法),優先使用 Lambda:

// 匿名內部類
Runnable r1 = new Runnable() { @Override public void run() { System.out.println("Hi"); } };
// Lambda
Runnable r2 = () -> System.out.println("Hi");

但抽象類、多方法介面、需存取 this 參考外部類成員時,匿名內部類仍不可替代。

總結

匿名內部類是「就地實作、一次性使用」的利器,核心場景:事件監聽器、執行緒任務、策略模式臨時實作、測試 Mock。理解其編譯產物與捕獲變數機制,能避免記憶體洩漏與行為錯誤。Lambda 簡化了函數式介面情境,但未完全取代匿名內部類的所有用途。

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