多態建立在繼承基礎之上。子類通過 extends 繼承父類的屬性與方法,甚至不聲明任何新成員也能擁有父類的所有能力。
class Father {
String sex = "man";
public void sport() { System.out.println("太極"); }
}
class Son extends Father {
String sex = "small boy";
int age = 15;
@Override public void sport() { System.out.println("打球"); }
public void homework() { System.out.println("do homework"); }
}
Father xiaoming = new Son();
這行代碼可拆解為兩步:
new Son() 在堆內存創建一個 Son 完整對象(包含父類繼承部分與子類自有部分);Father xiaoming 用父類類型引用指向該對象。age、homework());sex、sport());| 訪問目標 | 結果 | 說明 |
|---|---|---|
| xiaoming.sex | Father.sex ("man") | 屬性無多態,編譯期綁定父類 |
| xiaoming.sport() | Son.sport() ("打球") | 方法有多態,運行期動態分派到子類重寫版本 |
| xiaoming.age | 編譯報錯 | 父類引用無法直接訪問子類特有屬性 |
| xiaoming.homework() | 編譯報錯 | 父類引用無法直接調用子類特有方法 |
需向下轉型:
if (xiaoming instanceof Son) {
Son son = (Son) xiaoming;
System.out.println(son.age); // 15
son.homework(); // do homework
}
不要被「多態」這個術語嚇到。本質就是:同一個引用,指向不同子類對象時,調用同一方法呈現不同行為。掌握「編譯看左、運行看右」與「屬性靜態綁定、方法動態分派」兩條鐵律,多態就不再神秘。