方法重载它如何决定在以下情况下调用哪个版本的重载方法

Dha*_*oot 0 java overloading

在java中,我有2个重载方法,一个是main方法,所以从main方法调用重载方法。

public class Test {
public static void main(String[] args) throws IOException {
    doSomething(null);
}
private static void doSomething(Object o) {
    System.out.println("method with Object in signature is called.");
}
private static void doSomething(String s) {
    System.out.println("method with String in the signature is called.");
}
}
Run Code Online (Sandbox Code Playgroud)

在这里,当我运行此 java 代码时,它将调用 doSomething(String s) 方法并打印

调用签名中带有 String 的方法。

我认为它会调用 doSomething(Object o) 方法,但它不会发生。

那么任何人都可以更详细地向我解释这一点,为什么会发生这种情况以及如何发生?

谢谢你。

And*_*ner 8

JLS 15.12.2.5(强调):

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

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而没有编译时错误,则一个方法比另一个方法更具体。

任何可以传递给String方法的东西也可以传递给Object方法,而有些东西你可以传递给Object方法而不能传递给String方法(例如new Object())(*);因此该String方法更具体,因此选择了该方法。


(*) 这个子句很重要:如果你用以下Object方法替换了方法,请说:

private static void doSomething(Integer s) {
Run Code Online (Sandbox Code Playgroud)

那么就会有你可以传递给doSomething(String)你不能传递给的东西doSomething(Integer);并且有些东西你可以传递给doSomething(Integer)你不能传递给doSomething(String)。在那种情况下,两者都不是更具体的,因此方法调用将被认为是不明确的。