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

Java 繼承中強制轉型無法調用被覆寫的父類方法:多態機制解析

     編輯:程式設計綜合問答

程式碼情境

class A { public int f() { System.out.println("call A.f()"); return 1; } }
class B extends A { public int f() { System.out.println("call B.f()"); return 2; } }
class C extends B { public int f() { System.out.println("call C.f()"); return 3; } }

public class Test01 {
    public static void main(String args[]) {
        C c = new C();
        System.out.println(((A)c).f()); // 輸出 call C.f() 而非 call A.f()
    }
}

為什麼 ((A)c).f() 仍呼叫 C.f()?

Java 方法調用採用動態繫結:編譯期看引用型別(A),執行期看實際物件型別(C)。強制轉型 (A)c 僅改變引用的靜態型別,不改變物件在堆上的實際型別。因此 JVM 依然根據物件真實類型 C 分派到 C.f()。

正確做法

  • 若確實需要父類邏輯,在子類中用 super.f() 呼叫(僅限直接父類)。
  • 或建立父類實例:A a = new A(); a.f();。
  • 若設計上需「跳過中間類」,說明繼承結構可能不當,考慮組合替代繼承。

核心概念

  • 多態:同一引用指向不同實例時表現不同行為。
  • 方法覆寫:子類重新定義父類非私有方法。
  • 強制轉型:僅影響編譯期型別檢查,不影響運行期方法分派。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved