我有以下代码
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 {
}
我得到的输出是达到2
为什么第二个功能被选中执行而不是第一个?此外,当我通过使另一个类NewTest2扩展Test和类似的printData()函数尝试相同的代码时,它给了我编译时错误。是否有任何规则选择必须执行哪个功能以及何时执行?
答案 0 :(得分:6)
为什么第二个功能被选中执行而不是第一个?
因为采用NewTest
的方法比采用Test
的方法更具体,并且两者都可访问且适用。
但是,当你有两个Test
的子类时,转换都没有比另一个更具体,因此调用是不明确的。
请参阅JLS section 15.12.2.5了解相关的确切规则:
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。
答案 1 :(得分:0)
你使用什么IDE? 在Eclipse中,“h.printData(null)”标记为红色,显示以下错误:
方法printData(Test)对于HelloWorld类型是不明确的。
在这种情况下,您需要像这样转换null:
“h.printData((试验)空)”