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

Java 匿名內部類完全指南:五大使用模式與編譯原理

     編輯:Java 綜合教學

Java 匿名內部類完全指南

匿名內部類是 Java 的語法糖,簡化「一次性實現接口/繼承類」的代碼。本文通過五大經典模式演示用法,並揭示編譯後的字節碼真相。

模式一:實現接口

public interface IWriter { void write(); }

public static void main(String[] args) {
    IWriter writer = new IWriter() {
        @Override public void write() {
            System.out.println("IWriter write...");
        }
    };
    writer.write();
}

模式二:繼承抽象類

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

public static void main(String[] args) {
    AbstractWriter aw = new AbstractWriter() {
        @Override public void write() {
            System.out.println("AbstractWriter write...");
        }
    };
    aw.write();
}

模式三:繼承具體類(覆寫方法)

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

public static void main(String[] args) {
    TextWriter tw = new TextWriter() {
        @Override public void write() {
            System.out.println("TextWriter 2 write...");
        }
    };
    tw.write();
}

模式四:線程中使用

public static void main(String[] args) {
    Thread t = new Thread() {
        @Override public void run() {
            new IWriter() {
                @Override public void write() {
                    System.out.println("IWriter thread write...");
                }
            }.write();
        }
    };
    t.start();  // 注意:應調用 start() 而非 run()
}

編譯原理揭秘

編譯器會為每個匿名內部類生成獨立 .class 文件,命名規則:外部類$序號.class(如 Main$1.class、Main$2.class)。

編譯生成的 class 文件

本質上等同於手寫獨立實現類,但語法糖帶來:

  • 代碼局部化,讀寫同處
  • 自動捕獲外部 final/Effectively final 變量
  • 減少頂層類污染

注意事項

  1. JDK 8+ 建議優先使用 Lambda 表達式(函數式接口)
  2. 匿名類持有外部類引用,可能導致內存洩漏(如長生命周期對象持有 Activity/Context)
  3. 無法定義構造函數,初始化邏輯只能放在實例初始化塊 { } 中
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved