java 過載:子類父類 與 多型動態繫結靜態過載
問題:
子類能否過載父類的型別?
答:
完全可以,先看一個例子,接下來會有另一種情況
public class Son extends Father{
public void test(int i){
System.out.println("This is from Son class and the number is " +i);
}
public static void main(String args[]){
Son son = new Son(); //////這裡要注意,接下來在這裡做文章會發生改變
son.test();
son.test(1);
}
}
class Father{
public void test(){
System.out.println("This is from Father class");
}
}
輸出結果為
This is from Father class
This is from Son class and the number is 1
那麼這是可行的。現在書上說,過載是靜態編譯時完成的,與動態時的重寫確定方法不同,那麼我就用父類來繫結子類呼叫方法來試驗一下什麼時候子類過載父類的方法可以成功。
class TestSon extends Test{
protectedvoid fun(inti) {
System.out.println("Son!"
}
}
publicclass Test {
protectedvoid fun(){
System.out.println("Father!");
}
public static void main(String[] args) {
Test t = new TestSon();
t.fun();/////////////////////////////////////////////這裡體現”靜態“的關鍵,體現在兩點:1.eclipse開啟了自動提示時,僅僅有一個fun()的選項,而fun(int)的選項沒有。2.這裡靜態編譯時,t是Test型別,並且編譯時僅僅通過尋找過載的可能來確定呼叫哪一個函式,而重寫呼叫什麼函式是動態時確定的,所以這裡僅僅判斷Test類中寫了過載沒有,一查詢,發現沒有,所以確定呼叫的函式是父類的fun。這裡在靜態時已經確定使用什麼函數了,所以動態時就再沒有二次確定,所以子類“過載”沒能成功。
TestSon t = new TestSon();
t.fun();
t.fun(1);//////////////////////////////////////這裡就能夠成功,是因為在靜態編譯時在宣告的類TestSon中尋找,發現有父類的fun與子類過載的fun兩個,然後根據函式傳遞引數型別確定呼叫哪一個函式。
}
}
這裡涉及到多型的jvm實現方式,靜態確定在哪一個類中過載哪一個方法,動態確定到底是哪一層的方法,是子類的重寫還是父類。