初學者常見疑問:new Father(){ ... } 明明是 new 一個對象,為什麼說生成了「匿名類」?小括號後跟大括號是什麼意思?
new Father(){ ... } 的執行過程分兩步:
// 匿名內部類寫法
Father f1 = new Father() {
@Override
public void abstractMethod() { ... }
// 可添加新字段、方法
};
// 等價於顯式定義實現類
class FatherImpl extends Father {
@Override
public void abstractMethod() { ... }
}
Father f1 = new FatherImpl();
final 或 effectively final 變量,形成閉包效果。() -> { ... } 替代單方法接口(函數式接口)的匿名類,更簡潔、性能更好(invokedynamic)。{ ... } 完成初始化邏輯。OuterClass$1.class、OuterClass$2.class 等文件。new 接口/類() { 類體 } = 定義子類/實現類 + 實例化 的語法糖。理解這一點,閱讀舊代碼、遷移至 Lambda、排查類加載問題將不再困惑。