为什么这是程序的输出?

时间:2013-04-10 05:27:36

标签: java overloading

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 ?

我试过阅读第6版的JLS,但我仍然找不到答案。

我猜的唯一原因是选择了继承层次结构中最接近的匹配。

所以在这种情况下,它将采用String作为Object是它的超类。

3 个答案:

答案 0 :(得分:3)

问题Method Overloading for NULL parameter中提供了此答案:

  

Java将始终尝试使用可用方法的最具体适用版本(请参阅JLS §15.12.2)。

因此,使用String,因为它是可用的最具体类型。如果存在多个子类型,则必须将null强制转换为适当的类型以指定要运行的函数。

答案 1 :(得分:1)

这在§15.12.2.5. Choosing the Most Specific Method中详细说明:

  

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。

     

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。

在您的示例中,add(Object)可以处理add(String)可以执行的任何操作。这使得后者更具体。因此,它被选择处理null

答案 2 :(得分:0)

如果多个成员方法都可以访问并适用于方法调用... Java编程语言使用规则选择最具体的方法

请参阅T he Java Language Specification