为什么这是程序的输出?

Sam*_*Sam 7 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么是程序的输出 With String ?

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

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

所以在这种情况下,它需要String作为Object是它的超类.

小智 3

这个答案可以在问题“NULL 参数的方法重载”中找到中找到:

\n\n
\n

Java 将始终尝试使用可用方法的最具体适用版本(请参阅 JLS \xc2\xa715.12.2)。

\n
\n\n

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

\n