2013-04-10 97 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