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

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

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

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

请参阅JLS规范

15.12.2.5。 选择最具体的方法

它是Joshua Bloch的Java Puzzlers的难题之一 – Puzzle 46: Confusing Constructor的案例

Java Compiler选择最具体的方法。

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

你在调用方法中传递null ,并且你定义了void方法(String str)和String总是使用null进行initlize。 它会找到匹配的参数化方法。 多数民众赞成在控制台上获得了“str”。

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

这是因为方法重载

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

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