Java如何决定使用相同名称和不同参数类型的方法?

Java如何决定使用相同名称和不同参数类型的方法?,java,overloading,Java,Overloading,这个程序神奇地调用字符串方法?Java编译器根据什么标准决定使用字符串方法?有人能告诉我原因吗?规则是编译器从所有匹配项中选择“最特定”的重载。由于String是Object的子类,这使得String版本“更具体”,因此它被选择在这里: Java语言规范的有效部分是: 如果一个方法调用可以访问并适用于多个成员方法,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用的规则是选择最具体的方法 非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法,而不会出现编译时类

这个程序神奇地调用字符串方法?Java编译器根据什么标准决定使用字符串方法?有人能告诉我原因吗?

规则是编译器从所有匹配项中选择“最特定”的重载。由于String是Object的子类,这使得String版本“更具体”,因此它被选择在这里:


Java语言规范的有效部分是:

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

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


JLS接着给出如何确定最具体方法的详细技术规范。

并且,如果要使用Object方法,可以将参数强制转换为对象--
new Main().testMethod((Object)null)
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);
    }
}