class Father {
String fs = "new father";
public void say() { System.out.println("father say()"); }
}
class Son extends Father {
public Son() { fs = "new son"; }
@Override
public void say() { System.out.println("son say()"); }
}
public class Test {
public static void main(String[] args) {
Father ff = new Son(); // 向上轉型
ff.say(); // 輸出 "son say()"
}
}
Java 中非靜態方法調用採用動態綁定(晚綁定):
Father 類是否有 say() 方法,通過編譯。Son)在方法表中查找 say(),發現 Son 覆寫了該方法,調用 Son.say()。| 概念 | 說明 |
|---|---|
| 向上轉型 | 引用類型變為父類,只能調用父類聲明的方法(編譯期約束)。 |
| 動態綁定 | 運行時根據實例類型決定調用哪個覆寫方法(運行期行為)。 |
| 字段訪問 | 無多態:ff.fs 訪問的是 Father.fs(編譯期綁定)。 |
System.out.println(ff.fs); // 輸出 "new father"(父類字段)
向上轉型後,方法調用看對象實際類型(多態),字段訪問看引用聲明類型(靜態綁定)。這是 Java 設計的核心,保證了「子類可以替換父類」的里氏替換原則。