正確。Java 中介面不能直接實例化,new MyInterface() { ... } 語法實際上是:隱式定義一個實現該介面的匿名類,並立即創建其實例。
// 源碼
Runnable r = new Runnable() {
public void run() { System.out.println("Hello"); }
};
// 編譯後生成兩個 class 文件
OuterClass.class
OuterClass$1.class // 匿名類,實現 Runnable
反編譯 OuterClass$1.class 可見:
class OuterClass$1 implements Runnable {
final OuterClass this$0;
OuterClass$1(OuterClass outer) { this$0 = outer; }
public void run() { System.out.println("Hello"); }
}
final 或實際上 final 的局部變數。// 函數式介面(單一抽象方法)可用 Lambda
Runnable r = () -> System.out.println("Hello");
// 編譯為 invokedynamic 指令,不生成匿名類 class 文件,效能更高
Lambda 非匿名類語法糖,而是利用 MethodHandle 動態生成實現類實例。
button.addActionListener(e -> ...)new Thread(() -> ...).start()list.sort((a,b) -> a.compareTo(b))