嘗試定義 abstract class LocalInner {} 在方法內部,編譯通過,但外部類無法繼承它;若改為 interface 則編譯報錯。
Outer$1LocalInner 等合成名。public static,但局部類不能有訪問修飾符,且接口不能定義在方法內(JLS 規定),故編譯報錯。局部內部類的唯一用途:在方法內部創建一個一次性使用的類實例,通常配合接口或父類多態使用:
public Runnable createTask() {
class Task implements Runnable { // 匿名/局部類
public void run() { ... }
}
return new Task();
}
局部內部類設置為 abstract 或 interface 皆無實際意義,純屬語法允許但語義空洞。正確用法是實現接口/繼承父類並直接實例化,利用閉包捕獲外部 final/equivalent-final 變量。