在以下程序中:
public class PolyEx1 {
public static void main(String[] args) {
A refA = new A();
refA.method1(null);
}
}
class A {
public void method1(Object o) {
System.out.println("o");
}
public void method1(String str) {
System.out.println("str");
}
}
输出是“str”,有人能解释我为什么打印str?我无法理解这一点。
答案 0 :(得分:2)
正如Rohit here所解释的那样,
这是因为String类从Object扩展,因此更多 特定于对象。因此,编译器决定调用该方法。 请记住,编译器总是选择最具体的方法来调用。
如果多个成员方法都可访问且适用于a 方法调用,有必要选择一个提供 运行时方法调度的描述符。 Java编程 language使用选择最具体方法的规则。
非正式的直觉是一种方法更具体 如果可以传递第一个方法处理的任何调用,则为另一个 没有编译时类型错误的另一个。
但是,如果你有两个带参数的方法 - String和Integer, 然后你会得到null的歧义错误,因为编译器无法决定 哪一个更具体,因为它们是非协变类型。
如JLS的15.12.5部分所述
答案 1 :(得分:1)
Java尝试使用方法的最具体适用版本。
String
扩展Object
,因此始终会调用使用String作为参数的方法。
如果您尝试添加一个采用Integer
输入的方法,它会将错误视为不明确的方法,因为String
和Integer
两者都比Object更具体,但没有一个是比另一个更具体
答案 2 :(得分:0)
public void method1(String str)将被执行,因为object是字符串supperclass,因此将调用字符串方法。