初學者常在實作抽象類與匿名內部類時遇到程式「卡住不報錯」或「方法呼叫不符預期」的情況。以下代碼示範了典型錯誤:
// 父類
public abstract class Parent {
public abstract void onSuccess();
public void Success() { onSuccess(); }
}
// 子類
public class Child extends Parent {
@Override
public void onSuccess() { /* 空實作 */ }
}
// 呼叫端
public class Diaoyong {
public void diaoyong() {
new Child() {
@Override
public void onSuccess() { /* 匿名類實作 */ }
}; // 此處未呼叫任何方法
}
}
建立匿名物件後未呼叫任何方法,且缺少 main 入口,JVM 執行完建構子即結束。
匿名類覆寫了 onSuccess(),但父類 Success() 呼叫的是 this.onSuccess(),若未正確實例化子類,多態不會生效。
public class Child extends Parent {
@Override
public void onSuccess() {
System.out.println("Child onSuccess 實作父類抽象方法");
}
public static void main(String[] args) {
// 多態:父類引用指向子類物件
Parent parent = new Child();
parent.onSuccess(); // 執行子類實作
parent.Success(); // 父類方法內部呼叫子類覆寫方法
}
}
Parent parent = new Child();@Override 父類抽象或虛擬方法| 錯誤寫法 | 正確寫法 | 說明 |
|---|---|---|
new Child(){...}; 結束 | 指派給變數並呼叫方法 | 匿名物件需被引用才能使用 |
缺少 main | 加入靜態 main 入口 | JVM 需要啟動類 |
父類方法未宣告 abstract | 抽象方法需標記 abstract | 強制子類實作 |
此模式正是利用介面+匿名類/實作類,實現演算法的熱插拔:
interface Strategy { void execute(); }
public class Context {
private Strategy strategy;
public Context(Strategy s) { this.strategy = s; }
public void run() { strategy.execute(); }
}
// 使用
new Context(new Strategy() {
@Override public void execute() { System.out.println("策略A"); }
}).run();