2013-03-06 72 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