26

只是出于好奇,我尝试了这个例子。

public class Class1 {

    public void method(Object obj){
        System.out.println("Object");
    }

    public void method(String str){
        System.out.println("String");
    }

    public static void main(String... arg){
        new Class1().method(null);
    }

}

输出为“字符串”。我想知道 JVM 在什么基础上决定调用将 String 作为参数而不是 Object 的方法。

4

7 回答 7

18

只要可以将多个重载方法应用于参数列表,就会使用最具体的方法。

在这种情况下,任何一个方法都可以在传递时调用null,因为“null 类型”可以同时分配给ObjectString。采用的方法String更具体,因此将被选中。

于 2013-07-16T06:51:39.503 回答
10

只要有方法重载,JVM就会从最具体的类型到最不具体的类型搜索方法

于 2013-07-16T06:51:05.290 回答
6

请参阅JLS 规范

15.12.2.5。选择最具体的方法

它是Joshua Bloch 的 Java Puzzlers的谜题之一- Puzzle 46: Case of the Confusing Constructor

于 2013-07-16T06:53:15.193 回答
2

Java 编译器选择最具体的方法。

与Object相比,String是一种更具体的类型。

于 2013-07-16T06:57:40.023 回答
0

因为你在调用方法中传递了null并且你定义了 void method(String str) 并且 String 总是用 null 初始化。它会找到匹配的参数化方法。那就是你在控制台上得到了“str”。

于 2013-07-16T06:54:08.057 回答
0

当您进行方法重载时,jvm 会尝试到层次结构中的下一个。例如,如果您使用 long 和 int 重载方法,但通过传递字节来调用方法,它将首先进入 int,因为它在层次结构中是字节的下一个。

于 2013-07-16T07:03:12.963 回答
0

这是因为方法重载

在编译时选择最具体的方法。

因为“java.lang.String”是比“java.lang.Object”更具体的类型。在您的情况下,它返回字符串。

于 2013-07-16T07:33:40.270 回答