2013-04-10 93 views
7
public class OverloadingTest extends Format{ 

    public int add(String s1){ 
     System.out.println("With String"); 
     return 1; 
    } 
    public int add(Object a){ 
     System.out.println("With Object"); 
     return 1; 
    } 


    public static void main(String[] args) { 
     OverloadingTest overloadingTest = new OverloadingTest(); 
     overloadingTest.add(null); 
    } 

} 

爲什麼程序With String ?爲什麼這是程序的輸出?

我曾嘗試閱讀JLS的第6版的輸出,但我還是沒能找到答案。

我可以猜測的唯一原因是選擇了繼承層次結構中最接近的匹配項。

所以在這種情況下,它將採取字符串作爲對象是它的超類。

+5

你回答了你自己的問題:) – 2013-04-10 05:28:43

+0

的subber子類總是選擇.... – Thihara 2013-04-10 05:29:41

+1

@Deepak巴拉哦,太好了。但是,你有任何可以指出的參考或文件嗎? – Sam 2013-04-10 05:30:18

回答

3

這答案就在問題Method Overloading for NULL parameter可供選擇:

Java將始終嘗試使用的可用方法的最具體的適用版本(見JLS §15.12.2)。

因此,使用String,因爲它是可用的最具體類型。如果存在多個子類型,則必須將null轉換爲適當的類型以指定要運行哪個函數。

1

這在§15.12.2.5. Choosing the Most Specific Method闡明:

如果不止一個成員方法既方便和適用於方法調用,就必須選擇一個提供運行時方法調度描述符。 Java編程語言使用選擇最具體方法的規則。

非正式的直覺是,如果由第一個方法處理的任何調用可以傳遞到另一個沒有編譯時類型錯誤的方法,那麼其中一個方法比另一個更具體。

在你的例子中,add(Object)可以處理任何add(String)可以。這使得後者更具體。因此,它被選中來處理null

0

如果多於一個成員方法都可以訪問並適用於方法調用...... Java編程語言使用規則選擇最具體的方法

見T he Java Language Specification