在Java中,如果方法重寫隻是一種名字空間的編寫,那麼它最多是讓人感到有趣,但沒有實際價值,但情況并非如此。方法重寫構造成了Java最大的一個概念基礎:動态方法排程(dynamic method dispatch)。動态方法排程是一種機制,借助于這種機制,對一個已經重寫的方法的調用将在運作時,而不是在編譯時解析。動态方法排程非常重要,因為這關系到Java如何實作運作多态性的問題。我們知道,超類引用變量可以引用子類對象,Java使用這個事實來解決在運作時對重寫方法的調用。下面是運作原理:當一個超類引用調用一個重寫方法時,Java根據在調用時被引用對象的類型執行哪個版本的方法。換句話說,是被引用對象的類型(不是引用變量的類型)決定将執行哪個版本的重寫方法。是以,如果說超類包含一個被子類重寫的方法,那麼當通過超類引用變量來引用不同類型的對象時,就會執行那個方法的不同版本。示範如下:
public class ClassA {
void callme(){
System.out.println("Inside A's callme method");
}
}
public class ClassB extends ClassA{
void callme(){
System.out.println("Inside B's callme method");
}
}
public class ClassC extends ClassA{
void callme(){
System.out.println("Inside C's callme method");
}
}
public class Dispatch {
public static void main(String[] args) {
ClassA classA = new ClassA();
ClassB classB = new ClassB();
ClassC classC = new ClassC();
ClassA a = classA;
a.callme();
ClassB b = classB;
b.callme();
ClassC c = classC;
c.callme();
}
}
程式運作結果:
Inside A's callme method
Inside B's callme method
Inside C's callme method
重寫方法允許Java支援運作時多态性。多态是面向對象程式設計的本質,它允許通用類指定方法,這些方法對該類的所有派生類都是公用的,同時該方法還允許子類定義這些方法中的某些或全部的特定實作。重寫方法是Java實作其多态性“一個接口,多個方法”的另一種方式。
成功應用多态性的關鍵是要了解超類和子類形成了從簡單到複雜的層次。為了正确應用多态性,超類提供了子類可以直接使用的所有元素。多态性也定義了派生類必須實作自己的方法,這允許子類在加強一緻接口的同時,靈活地定義它們自己的方法。是以,通過同時使用繼承和重寫方法,超類能夠定義供其所有子類使用的方法的通用形式。
運作時多态性是面向對象設計方法實作代碼重用和健壯性的最強大機制之一,代碼庫在維持抽象接口同時不重新編譯的情況下即調用新類的執行個體。
轉載于:https://blog.51cto.com/wujuxiang/406802