學習JavaWeb的時候看到老師重載方法的參數分別爲子類和父類,想測試下哪個優先級高,虛擬機究竟如何選擇
首先寫好父類
public class father {
public void test(father f) {
System.out.println("父類父類");
}
public void test(Son s) {
System.out.println("父類子類");
}
}
然後寫一個子類用來測試重載
public class Son extends father {
public static void main(String[] args) {
father f = new Son();
Son s =(Son) f;
f.test(f);
f.test(s);
}
}
可以看到輸出如下:
父類父類
父類子類
把父類的參數爲Son s的方法註釋掉,輸出如下:
父類父類
父類父類
把父類的參數爲Father f的方法註釋掉,當編譯時f.test(f)發生錯誤
這說明Java重載函數的選擇只關注引用類型,不關注在內存裏面具體的類型,沒有多態的產生。
當沒有符合引用類型的參數時,會自動向父類轉換
Java重載是在編譯過程中進行的,區別於在運行過程中的重寫
向父類轉換又想到了很有意思的問題,如果同時擁有兩個同一級別的父類,那JVM會幫我們選擇哪個。由於JAVA是單繼承,多實現,所以只能讓子類實現兩個接口,此時代碼如下
public class father {
public void test(AA a) {
System.out.println("AA接口");
}
public void test(BB b) {
System.out.println("BB接口");
}
}
//AA,BB是兩個空接口
public class Son extends father implements AA,BB{
public static void main(String[] args) {
father f = new Son();
Son s =(Son) f;
f.test(s);
}
}
程序報錯
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method test(AA) is ambiguous for the type father