1. 程式人生 > >關於多型(記憶體分析)

關於多型(記憶體分析)

public class A {
    public void set() {
        System.out.println("----a------");
    }
}

public class B extends A {
    public void set() {
        System.out.println("----b------");
    }

    public static void main(String[] args) {
        A a = new A();
        A b = new B();
        a.set();
        b.set();
    }
}

當A中沒有定義和B方法中相同的簽名方法時,A呼叫B的方法,那麼編譯報錯;如果滿足了繼承、重寫、引用子類型別,那麼呼叫的是子類方法;也就是new了誰的物件就呼叫誰的方法;

在記憶體中可以理解為:子類有父類的指標,而父類沒有子類的指標(這裡的指標指C++在底層的實現,Java並沒有指標),繼承才有

父類的引用可以指向子類的實列,那為什麼不能呼叫子類獨有的方法呢

Java程式碼在執行的時候,會有維護相應的方法表,多型在Java裡的體現主要是過載和覆蓋,如下:

public class DynasicDispath {
    static abstract class Human{
        protected abstract void sayHello();
    }
    static class Man extends Human{ 
        protected void sayHello() {
            System.out.println("man say hello");
        };
    }
    static class WoMan extends Human{ 
        protected void sayHello() {
            System.out.println("woman say hello");
        };
    }
    
    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new WoMan();
        man.sayHello();
        woman.sayHello();
        man = new Man();
        man.sayHello();
        
    }
}
父類有一個方法,在子類可以覆蓋對應的方法,使得父類有多個不一樣的實現形式

--->你有沒有試過springmvc多個impl實現一個service

在Java程式碼實際執行的時候,Java虛擬機器裡面有一個叫方法區的記憶體空間,方法區裡面就維護了子類相對應的方法表,如果在子類找不到對應的方法就會去父類找(Java裡面的多型又不僅僅是繼承,我們現在解決的是,Java編譯和執行時,方法引用的不同,影響結果),會有各種指標指向方法區裡面的常量,比如一個類Person,那這個類的Java檔案編譯成class檔案之後,在class檔案裡面會有一個符號引用,這個符號引用會指向一個常量“Person”,在真正執行的時候,這個符號引用就是C++裡面的指標,在編譯的時候,還不知道那個字串的地址,在真正執行的時候,這個字串會在方法區域裡面初始化,在類載入的時候,首先會在對應的記憶體裡面,有一個指標指向字串對應的地址(Java虛擬機器就是C++實現的),在Java裡面,建立物件要分配記憶體,另一種分配方式就是根據執行緒來的,Java虛擬機器會給每一個執行緒預留記憶體用作物件分配;