出于好奇,我尝试了这个例子。
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);
}
}
输出为“String”。我想知道JVM在什么基础上决定调用以String为参数而不是Object的方法。
答案 0 :(得分:17)
只要可以将多个重载方法应用于参数列表,就会使用最具体的方法。
在这种情况下,在传递null
时可以调用任一方法,因为“null类型”可分配给Object
和String
。采用String
的方法更具体,因此将被选中。
答案 1 :(得分:10)
每当有方法重载时,JVM将搜索从最特定类型到最不具体类型的方法
答案 2 :(得分:6)
答案 3 :(得分:2)
与对象相比,Java编译器选择最具体的方法。
字符串是一种更具体的类型。
答案 4 :(得分:0)
你在调用方法时传递了 null ,你定义了void方法(String str) 并且String总是使用null初始化。它会找到匹配的参数化方法。 那你在控制台上得到了“str”。
答案 5 :(得分:0)
当你进行方法重载时,jvm尝试进入层次结构中的下一个。对于例如如果使用long和int重载方法,但是通过传递byte调用方法,它将首先转到int,因为它是层次结构中的下一个字节。
答案 6 :(得分:0)
这是因为方法重载
在编译时选择最具体的方法。
因为'java.lang.String'是比'java.lang.Object'更具体的类型。在你的情况下,它返回String。