Java繼承和多型的底層原理
阿新 • • 發佈:2018-10-31
當子類繼承父類以後,子類的物件為什麼可以訪問到父類中定義的方法?當子類Override了父類中的方法以後,訪問的是子類Override以後的方法,這是怎麼實現的?當子類Override了父類的方法以後,還有辦法得到父類的方法嗎?部落格:重寫(overwrite)、過載(overload)和覆蓋(override)三者之間的區別
- 子類已經覆蓋了父類,並且重寫了父類的方法, 一般來說, 就沒有必要用子類呼叫父類中被覆蓋的方法了.(否則就不要覆蓋了啊)
- 要實現也是可以的 ,我們 需要為子類提供一個其他的方法,用於去呼叫父類中被覆蓋的方法
class A {//父類 public void print() { System.out.println("父類的print方法"); } } class B extends A {//子類 @Override public void print() { System.out.println("子類的print方法"); } // 在子類裡創造一個方法去呼叫父類的方法 public void fuLeiPrint() { super.print(); //super指向父類 } } public class Test { public static void main(String[] args) { B b = new B(); b.print(); b.fuLeiPrint(); // A a =(A)b; // 這樣強轉還是列印的子類的方法,因為記憶體中還是子類 // a.print(); } }
為什麼下面程式碼
public class Main {
public static void main(String[] args) {
Father father = new Child();
father.say();
}
}
的輸出為:
Hello From Child
呢? 明明是用的Father的引用去訪問的子類的物件,按照多型的字面理解,應該表現出Father的方法。
我的解釋如下:Father的引用指向的是Child的物件,而Child中又把Father中的方法給覆蓋了,所有表現出來的還是Child中被覆蓋的方法,不是Father中的方法。Father只是提供了一個View Port(視口)來訪問Child物件。
部落格: Java中方法的繼承以及父類未被子類覆蓋的方法呼叫的問題
下面部落格講解的更加深入:
java:方法的虛分派(virtual dispatch)和方法表(method table)
自制Java虛擬機器(五)實現繼承、多型、invokevirtual
Java語言的動態性-invokedynamic
Java程式設計的邏輯 (17) - 繼承實現的基本原理