2014-09-06 46 views
4

我是Java的新學習者。我想了解在函數和函數重載中傳遞參數的概念。我在java網站上發現了幾個例子,其中給出了下面的代碼,我懷疑如果將null傳遞給nh(),那麼在輸出中顯示「string」的方式。下面是代碼JAVA中函數重載的困惑

public class CLI_APP 
{ 
    public static void main(String[] args) 
    { 
     jh(null); 
    } 
    public static void jh(String s) 
    { 
     System.out.print("String"); 
    } 
    public static void jh(Object o) 
    { 
     System.out.print("Object"); 
    } 
} 

在相同的代碼,如果下面的行添加

public static void jh(Integer s) 
{ 
    System.out.print("Integer"); 
} 

我的

的編譯錯誤 「方法不明確」

WHY這發生了嗎?

回答

5
my doubt is if null is passed to nh() then how "string" is displayed in output 

重載的方法從類的底層到頂層進行匹配。 Object班坐在頂層,所以最後會匹配。話雖如此,null第一次匹配String參數方法和一個字符串可以爲空,所以這個方法被調用。

如果您還添加下面的方法

public static void jh(Integer s) 

到您的代碼,然後調用jh(null)介紹IntegerString既是之間的模糊性可以null

精益更多在這裏:Java Language Specification: Choosing the Most Specific Method

0

的Java始終用最具體的方法。在你的第一個例子中,它將打印「String」而不是「Object」,因爲String比Object更具體。

在第二個例子中,如果null對整數或字符串更好,java將無法選擇。您應該施放您的電話或使用原語來消除您的模糊性。

這會工作:

public static void jh(int s) 
{ 
    System.out.print("Integer"); 
} 

而且這會工作:

jh((String) null); 
1

Integer和String都支持空,所以它在編譯時產生歧義錯誤, 現在,如果你使用int而不是Integer,那麼它將工作,因爲int不支持null。

public class testJava { 
    public static void main(String[] args) 
    { 
     jh(null); 
    } 
    public static void jh(String s) 
    { 
     System.out.print("String"); 
    } 
    public static void jh(Object o) 
    { 
     System.out.print("Object"); 
    } 
    public static void jh(int o) 
    { 
     System.out.print("Object int"); 
    } 
} 
+0

所以,如果從整數改變爲int將它稱之爲字符串的方法???? – 2014-09-06 05:48:11

+0

是的,它會。通過執行上面的例子來檢查它。 – bharatpatel 2014-09-06 06:24:18