Java多態中重載方法選擇

學習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

發佈了14 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章