public class Main {
public void testMethod(Object o){
System.out.println("Object Method called");
}
public void testMethod(String s){
System.out.println("String Method called");
}
public static void main(String[] args) {
new Main().testMethod(null);
}
}
这个程序神奇地调用String方法? Java编译器决定使用String方法的标准是什么?有人可以指出我的理由吗?
答案 0 :(得分:12)
规则是编译器从所有匹配中选择“最具体”的重载。由于String是Object的子类,因此使String版本“更具体”,因此选择
答案 1 :(得分:2)
Java语言规范的操作部分是JLS 15.12.2.5:
然后,JLS继续提供有关如何确定最具体方法的详细技术规范。“如果多个成员方法都可以访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用以下规则:选择最具体的方法。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。“
答案 2 :(得分:0)