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

Java 繼承與多態詳解:為什麼父類引用無法直接調用子類特有方法?

     編輯:程式設計疑難解答

問題現場

package test;
public class A {
    public void A1() { System.out.println("A的方法"); }
}

package test;
public class B extends A {
    public void B1() { System.out.println("B的方法"); }
}

// 測試代碼
A a = new B();
a.B1(); // 編譯錯誤:找不到符號

核心原因

引用類型決定可見成員,對象類型決定具體實現。

  • 變量 a 聲明類型為 A,編譯器只認可 A 類中定義的方法(包括繼承來的)。
  • B1() 是 B 類特有的方法,A 類中不存在,因此編譯器報錯。
  • 運行時對象確實是 B 類實例,但編譯期類型檢查不通過。

解決方法:向下轉型

if (a instanceof B) {
    B b = (B) a; // 向下轉型
    b.B1();      // 現在可以調用
}

設計建議

  1. 盡量面向抽象編程:在父類定義公共接口,子類重寫實現,避免調用子類特有方法。
  2. 若必須調用子類特有方法,說明設計可能存在缺陷,考慮重構(如提取接口、使用訪問者模式等)。
  3. 轉型前務必 instanceof 判斷,防止 ClassCastException。

記住口訣

「父類引用指向子類對象,只能調用父類定義的方法;子類特有方法需向下轉型。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved