虛擬機字節碼執行引擎隨記(一)方法重載與靜態分派的關係

首先,我們先看下下面這段簡單的代碼:

    static abstract class Human {
    }

    static class Man extends Human {
    }

    static class Woman extends Human {
    }

    public void say(Human human) {
        System.out.println("Human say.");
    }

    public void say(Man man) {
        System.out.println("Man say.");
    }

    public void say(Woman woman) {
        System.out.println("Woman say.");
    }

類Man和類Woman是Human類的子類。方法say有根據參數的不同有三個輸出結果不同重載版本。

現在,運行這樣一段程序,讀者可以思考下會輸出什麼?

    public static void main(String[] args) {
        Draft draft = new Draft();

        Human man = new Man();
        Human woman = new Woman();

        draft.say(man);
        draft.say(woman);
    }

答案是:

原理:

Human man = new Man();
Human woman = new Woman();

上面這兩行代碼中,Human稱爲變量的靜態類型(外觀類型),Man和Woman稱作變量的實際類型。變量的靜態類型是在編譯期就可知的,而實際類型則需要到運行期才能確定。

在重載時,是通過參數的靜態類型(外觀類型)來判斷使用哪一個重載方法。

所以就會出現兩次調用say方法輸出的都是Human say.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章