多態:父類引用指向子類物件,同一操作作用於不同物件產生不同行為。核心在於動態綁定。
| 綁定類型 | 時機 | 適用方法 |
|---|---|---|
| 靜態綁定(早期綁定) | 編譯期 | static、final、private、建構器 |
| 動態綁定(晚期綁定) | 執行期 | 其他實例方法 |
Dance dance = new Latin(); dance.play(); // 實際呼叫 Latin.play()JVM 執行步驟:
Dance 類常量池記錄 play() 方法符號引用Dance 方法表找到 play 索引 → 記錄到常量池Latin,去 Latin 方法表同索引位置取得直接位址 → 執行 Latin.play()class Dance {
public void play() { System.out.println("Dance.play"); }
public void play(int i) { System.out.println("Dance.play" + i); }
}
class Latin extends Dance {
@Override public void play() { System.out.println("Latin.play"); }
public void play(char c) { System.out.println("Latin.play" + c); }
}
class Jazz extends Dance {
@Override public void play() { System.out.println("Jazz.play"); }
public void play(double d) { System.out.println("Jazz.play" + d); }
}
public class Test {
public void perform(Dance dance) { dance.play(); }
public static void main(String[] args) {
new Test().perform(new Latin()); // 輸出:Latin.play
}
}
深度解析:Java 多態與動態綁定底層原理