匿名內部類是 Java 內部類的一種特殊形式,無類名、單次使用、隱式實現接口或繼承類。本文系統梳理其定義、三大分類、編譯行為與訪問權限規則。
A 含匿名內部類編譯後生成 A.class 與 A$1.class、A$2.class...(數字序號)static 則僅能訪問靜態成員new SuperClass() {
@Override
public void method() {
// 實現邏輯
}
};

new InterfaceName() {
@Override
public void interfaceMethod() {
// 實現邏輯
}
};

someMethod(new InterfaceName() {
@Override
public void interfaceMethod() {
// 實現邏輯
}
});

| 特性 | 說明 |
|---|---|
| 構造器 | 無法顯式定義構造器(無類名),可用實例初始化塊 { ... } 替代 |
| final 限制 (Java 7-) | 訪問外部局部變量需聲明 final,Java 8+ 實際最終不可變即可 |
| this 引用 | this 指向匿名類實例,外部類用 OuterClass.this |
| 序列化風險 | 編譯器生成合成類名不穩定,極不建議 實現 Serializable |
Java 8+ 推薦使用 Lambda 表達式替代單方法接口的匿名內部類,代碼更簡潔、語義更清晰:
// 匿名內部類
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { doSomething(); }
});
// Lambda (函數式接口適用)
button.addActionListener(e -> doSomething());