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类型”可以分配给Object
和String
。 采用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。