關於 java 的動態綁定機制

關於 java 的動態綁定機制

聊一聊動態綁定機制, 相信看完這篇文章,你會對動態綁定機制有所了解。
網上大多一言概括:
當調用對象的時候,該方法會和該對象的記憶體地址/運行類型綁定。
當調用對象的屬性時,沒有動態綁定機制,哪裡聲明就使用哪裡。
這裡我們展開來說一說。
動態綁定機制,簡單來說,就是在以父類為編譯類型,創建子類對象的時候,綁定子類運行類型,當我們再調用方法的時候,能夠有序的尋找方法,實現方法的有序調用。
動態綁定機制會出現在多態中,多態是 Java 的重要的三個屬性之一,動態綁定機制就是建立在,封裝,多態,繼承的基礎上延伸出的。

要了解動態綁定機制,首相要把對象的多態與繼承搞明白,還有編譯類型,運行類型,這是前提。網上都有詳細的講解,這裡不做延伸。

廢話不多書,直接上程式碼演示講解,詳細的講解會在程式碼的注釋當中。

首先我們要創建父類 Person 類

//創建父類
public class Person {
    //簡單的創建兩個屬性
    private String name;
    private int age;

    //創建行為方法,方法中調用創建的say方法
    public void haviours(){
        say();
    }
    //創建方法
    public void say(){
        System.out.println("我是人類!!!");
    }

}

創建子類 Student

//創建子類
public class Student extends Person {
    //創建學生的屬性
    private int  score;
    //重寫行為
    public void haviours(){
        say();
    }
    //重寫say方法
    public void say(){
        System.out.println("我是學生!!!");
    }
}

首先我們對 say 方法進行調用。

public class Demo01 {
    public static void main(String[] args) {
        //創建學生
        Person student = new Student();
        //調用學生的say()方法,由於我們的編譯類型是Person類,而運行類型是Student類,而動態綁定機制是綁定運行類型。
        //所以,當我們調用say()方法時,是調用Student類的say()方法
        student.say();//返回「我是學生」
        //、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
        //如果我們將student類的say()方法註銷,他尋找student類的say方法無果後,會再向它的父類調用say方法。返回我是人類,效果等同於

    }
}

但是,重點來了。。。。。。。。。。。。
如果我們調用的是 haviours 方法,那麼他的方法是調用什麼呢

public class Demo02 {
    public static void main(String[] args) {
        //創建學生
        Person student = new Student();
        //調用學生的haviours方法,由於我們的編譯類型是Person類,而運行類型是Student類,而動態綁定機制是綁定運行類型。
        //所以,當我們調用haviours()方法時,該對象綁定的是Student類,所以是調用Student類的say()方法
        student.haviours();//返回我是學生!!!
    }
}

但是,還有人可能會有疑問,如果 Student 類中的 havious 方法被注釋掉呢,你是不是會想。子類 Student 中沒有 havious 方法,調用父類的 havious 方法,然後 havious 調用父類的 say 方法???
抱歉了,他調用的是子類 Student 的 Say 方法

public class Demo03 {
    public static void main(String[] args) {
        //創建學生
        Person student = new Student();
        //調用學生的haviours方法,由於我們的編譯類型是Person類,而運行類型是Student類,而動態綁定機制是綁定運行類型。
        //所以,當我們調用haviours()方法時,由於子類沒有havious方法,調用父類的havious方法,在父類的havious中,調用say方法,這時,動態綁定機制是綁定運行類型。該對象綁定的是Student類,所以是調用Student類的say()方法
        student.haviours();//返回我是學生!!!
    }
}

介紹完動態邦迪機制對方法的綁定,接下來說一說對屬性的影響。

當調用對象的屬性時,沒有動態綁定機制,哪裡聲明就使用哪裡。這句話十分容易理解。
也就是動態綁定機制對屬性沒有影響,放心調用。

動態綁定機制(完)。

結語:由於在網上查找相關的動態綁定機制時,看到沒有動態綁定的詳細講解,而這也是一個小難點,所以翻閱書籍,進行了學習,並進行總結,世界上本沒有路,走的人多了,也便有了路。

有興趣可以加QQ一起討論:3282300758