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(); // 現在可以調用
}
instanceof 判斷,防止 ClassCastException。「父類引用指向子類對象,只能調用父類定義的方法;子類特有方法需向下轉型。」