2013-03-06 101 views
6

當我運行這段代碼將打印String。我的問題是爲什麼沒有編譯時錯誤? Object和String的默認值爲null。那麼爲什麼不編譯器說Reference to method1 is ambiguousJava的重載的概念

public class Test11 
{ 

    public static void method1(Object obj) { 
     System.out.println("Object"); 
    } 

    public static void method1(String str) { 
     System.out.println("String"); 
    } 

    public static void main(String[] arr) { 
     method1(null);  
    } 
} 
+0

看到這個問題:http://stackoverflow.com/questions/377203/java-method-dispatch-with-null-argument – 2013-03-06 12:31:42

回答

0

井一句話

在重載方法的編譯器的情況下,選擇具有最 特定類型的方法中,作爲字符串是對象的編譯器 的最具體的類型將調用這需要字符串中的方法作爲參數

+0

非常感謝...現在我明白爲什麼String調用。 – Deepak 2013-03-06 12:39:36

+0

@ user2139744歡迎您:) – PermGenError 2013-03-06 12:40:13

3

this answer

在那裏,你會注意到這是一個編譯時任務。該JLS說,在第15.12.2:

此步驟使用方法的名稱和類型的參數表達式來定位,它們都可以訪問和應用可能有不止一個這樣的方法方法,其中案例最具體的一個被選中

+0

非常感謝我的清算概念 – Deepak 2013-03-06 12:38:16

3

編譯器會查看可能與您傳遞的參數相匹配的所有可能的重載方法。如果他們中的一個比所有別人那麼它會選擇更具體的,它只是認爲不明確的,如果沒有一個統一的最具體超載。

在您的例子有兩種可能的過載,​​和method1(String)。由於StringObject更具體的沒有歧義,並String選項進行選擇。如果有第三個過載如method1(Integer)那麼就不再呼叫method1(null)一個最具體的選擇,編譯器會產生一個錯誤。

+0

+1指出了錯誤的情況。 – 2013-03-06 12:42:24

+0

非常感謝您的回覆 – Deepak 2013-03-06 18:42:58

0
public class Test11 
{ 
public static void method1(String str)//here str is the object of string 
{ 

System.out.println("String"); 
} 

public static void method1(Object obj)//here this is a common object not specified 
{ 
System.out.println("Object"); 
} 



public static void main(String[] arr) 
{ 
    Test11 t=new Test11(); 
    String null1=new String(); 
    method1(null1); 
    method1(t); 
} 

} 

output is : 
String 
Object 

// null1-是一個字符串對象如果u通過此它將調用方法1(字符串str)僅因爲ü傳遞字符串對象 //叔是總的目的如果u通過此它會調用方法1(對象obj)只因爲你傳遞類objct所以它會傳遞對象作爲參數

+0

非常感謝您的回覆 – Deepak 2013-03-06 18:44:39