首先,我們先看下下面這段簡單的代碼:
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.