函数重载多态的null行为

Ani*_*kur 2 java polymorphism null overloading

我有以下代码

public class HelloWorld {

    public void printData (Test t) {
        System.out.println("Reached 1");
    }

    public void printData(NewTest t) {
        System.out.println("Reached 2");
    }

    public static void main(String args[]) {
        HelloWorld h = new HelloWorld();
        h.printData(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有两个简单的课程

class Test {
}

class NewTest extends Test {
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是 达到2

为什么第二个功能被选中执行而不是第一个?此外,当我通过使另一个类NewTest2扩展Test和类似的printData()函数尝试相同的代码时,它给了我编译时错误.是否有任何规则选择必须执行哪个功能以及何时执行?

Jon*_*eet 6

为什么第二个功能被选中执行而不是第一个?

因为采取的方法NewTest更具体的比法服用Test,无一不是方便和适用.

但是,当你有两个子类时Test,转换都不比另一个更具体,因此调用是不明确的.

有关所涉及的确切规则,请参阅JLS第15.12.2.5节:

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

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