1. 程式人生 > >Java繼承和多型的底層原理

Java繼承和多型的底層原理

當子類繼承父類以後,子類的物件為什麼可以訪問到父類中定義的方法?當子類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) - 繼承實現的基本原理