2

我有以下代码

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);
    }
}

我有两个简单的课程

class Test {
}

class NewTest extends Test {
}

我得到的输出是 Reached 2

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

4

2 回答 2

6

为什么选择执行第二个函数而不是第一个函数?

因为取法比取法NewTest更具体Test而且两者都是可访问和适用的。

然而,当你有两个子类时Test,没有一个转换比另一个更具体,因此调用是模棱两可的。

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

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

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

于 2013-08-16T10:29:07.070 回答
0

你用什么IDE?在 Eclipse 中,“h.printData(null)”被标记为红色,出现以下错误:

对于 HelloWorld 类型,方法 printData(Test) 是不明确的。

在这种情况下,您需要像这样强制转换 null :

“h.printData((Test)null)”

于 2013-08-16T10:31:52.127 回答