首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 抽象類與匿名內部類實作多態的正確姿勢

     編輯:程式設計疑難解答

問題背景

初學者常在實作抽象類與匿名內部類時遇到程式「卡住不報錯」或「方法呼叫不符預期」的情況。以下代碼示範了典型錯誤:

// 父類
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() { /* 匿名類實作 */ }
        }; // 此處未呼叫任何方法
    }
}

核心問題解析

1. 程式為何「走不下去」?

建立匿名物件後未呼叫任何方法,且缺少 main 入口,JVM 執行完建構子即結束。

2. 為何呼叫的是父類方法?

匿名類覆寫了 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();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved