为什么这是该程序的输出?

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 ?的程序的输出With String ?

我曾尝试阅读第六版JLS,但我仍然无法找到答案。

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

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


这个答案在问题方法重载NULL参数中可用:

Java将总是尝试使用可用方法的最具体适用版本(请参阅JLS第15.12.2节)。

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


这在第15.12.2.5节中有详细说明。 选择最具体的方法:

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

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

在你的例子中, add(Object)可以处理任何add(String)东西。 这使得后者更具体。 因此,它被选中来处理null


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

请参阅Java语言规范

链接地址: http://www.djcxy.com/p/70879.html

上一篇: Why is this the program's output?

下一篇: What is the best deployment practice when using MODX?