button.addActionListener(new ActionListener() { ... }); 中,匿名類作為參數傳遞時,是否「默認返回一個匿名對象」?
可以這麼理解:編譯器隱式生成一個實現該接口/繼承該類的匿名類,並在調用點 `new` 出一個實例傳遞給方法。
// 源碼
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { ... }
});
// 反編譯等價邏輯
class Outer$1 implements ActionListener { // 匿名類,名為 Outer$1
final Outer this$0; // 捕獲外部類引用
Outer$1(Outer outer) { this$0 = outer; }
public void actionPerformed(ActionEvent e) { ... }
}
// 調用點
btn.addActionListener(new Outer$1(this));
| 特性 | 說明 |
|---|---|
| 隱式 final | 捕獲的局部變量/參數必須是 final 或 effectively final (Java 8+)。 |
| 持有外部引用 | 非靜態匿名類隱式持有 Outer.this,可能導致內存洩漏(如 Handler、Thread)。 |
| 單例還是多例? | 每次執行到 new 都創建**新實例**;若在循環/頻繁調用中,考慮提取為具名類/單例/lambda。 |
| Lambda 替代 (Java 8+) | btn.addActionListener(e -> ...),更簡潔,語義為函數式接口實例,無額外類文件。 |
private static class MyListener implements ...。WeakReference 破環。**本質:語法糖,編譯期展開為具名類 + 實例化傳參。**