多態 = 重載 + 重寫,但本質區別巨大。Java 通過向上轉型 + 動態綁定 實現運行時多態。本文深度剖析引用變量轉型規則、靜態/動態綁定分工、成員變量/靜態方法/實例方法綁定差異,附完整代碼驗證輸出。
Animal animal = new Dog(); // 父類引用指向子類對象
Dog dog = (Dog) animal; // 向下轉型 (需 instanceof 守衛)
Creature creature = animal; // 向上轉型 (自動,安全)
animal = new Cat(); // 同一引用指向不同子類對象
instanceof。| 成員類型 | 綁定時機 | 綁定依據 | 多態性 |
|---|---|---|---|
| 成員變量 (實例/靜態) | 編譯期 (靜態綁定) | 引用變量聲明類型 | 無 |
| 靜態方法 | 編譯期 (靜態綁定) | 引用變量聲明類型 | 無 (隱藏非重寫) |
| 實例方法 | 運行期 (動態綁定) | 引用變量實際對象類型 | 有 (多態核心) |
class Father {
String var = "FatherVar";
static String staticVar = "StaticFatherVar";
void method() { System.out.println("Father method"); }
static void staticMethod() { System.out.println("Static Father method"); }
}
class Son extends Father {
String var = "SonVar";
static String staticVar = "StaticSonVar";
@Override void method() { System.out.println("Son method"); }
static void staticMethod() { System.out.println("Static Son method"); }
}
public class PolymorphismDemo {
public static void main(String[] args) {
Father f = new Son(); // 向上轉型
// 1. 實例變量:靜態綁定 → 看聲明類型 Father
System.out.println("f.var = " + f.var); // FatherVar
// 2. 靜態變量:靜態綁定 → 看聲明類型 Father
System.out.println("f.staticVar = " + f.staticVar); // StaticFatherVar
// 3. 實例方法:動態綁定 → 看實際對象 Son
f.method(); // Son method
// 4. 靜態方法:靜態綁定 → 看聲明類型 Father
f.staticMethod(); // Static Father method
}
}
f.var = FatherVar
f.staticVar = StaticFatherVar
Son method
Static Father method
| 維度 | 重載 | 重寫 |
|---|---|---|
| 發生位置 | 同一類 | 子類 vs 父類 |
| 方法名 | 相同 | 相同 |
| 參數列表 | 必須不同 | 必須相同 |
| 返回類型 | 無關 | 相同或子類 (協變) |
| 訪問權限 | 無關 | 不能縮小 (≥ 父類) |
| 拋出異常 | 無關 | 不能擴大檢查異常 |
| 綁定方式 | 靜態綁定 (編譯期) | 動態綁定 (運行期) |
| 多態性 | 無 (編譯期多態/靜態多態) | 有 (運行期多態/動態多態) |
Father f = new Son();
System.out.println(f.var); // FatherVar (字段遮蔽,靜態綁定)
System.out.println(((Son)f).var); // SonVar (向下轉型後看子類字段)
f.staticMethod(); // Static Father method (靜態隱藏)
Son.staticMethod(); // Static Son method (類名調用看類)
((Son)f).staticMethod(); // Static Father method! (仍看聲明類型)
Father.staticMethod(); // Static Father method
Father.staticMethod(),杜絕引用調用誤導。if (f instanceof Son) ((Son)f).sonMethod();。Java 多態 = 向上轉型 + 實例方法動態綁定。核心鐵律:
一句话心法:多態只屬於實例方法,其他都是靜態綁定的「假象」。向上轉型是門票,動態綁定是引擎。