JAVA Object / String方法重载

时间:2013-07-16 06:48:52

标签: java

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

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的方法。

7 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:10)

每当有方法重载时,JVM将搜索从最特定类型到最不具体类型的方法

答案 2 :(得分:6)

请参阅JLS specification

  

15.12.2.5。选择最具体的方法

这是Java Puzzlers by Joshua Bloch的难题之一 - 拼图46: 混淆构造函数的案例

答案 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。