2011-10-13 30 views
1
public void testFunc(Object o) { 
    System.out.println("testFunc-Object"); 
} 

public void testFunc(String s) { 
    System.out.println("testFunc-String"); 
} 

這兩種方法都在測試類中。如果我從測試類的main方法調用以下方法,將調用哪個方法?重載方法選擇的困境

Test t = new Test(); 
t.testFunc(null); 

在這種特殊情況下,調用testFunc(String),但爲什麼? 我將不勝感激您的幫助。

+3

爲什麼不測試它xD – Sibbo

+0

你問*爲什麼*答案是什麼?通過編譯和運行代碼可以看到哪個功能被選中。 – dlev

+3

當你嘗試時會發生什麼? – CPerkins

回答

6

testFunc(String s)被調用,因爲運行時將選擇帶有最具體參數的testFunc變體。 testFunc(String s)testFunc(Object o)更具體,因爲StringObject的子類型。

查看section 15.12.2.5 of the JLS瞭解詳情。

+0

是不是null同樣接近字符串和對象? – Zohaib

+0

我認爲這裏「最具體」的含義是String是Object的一個子類,所以Java比其超類更喜歡適用的子類。真正有趣的問題是如果你的函數使用了字符串和整數,會發生什麼。 – andronikus

+0

@andronikus @andronikus「ambiguous function」編譯時錯誤出現,如果你在同一場景中有兩個函數,但以Integer和String作爲參數 – Zohaib