public class Test{
public static void m1(Object o){
System.out.println("object called");
}
public static void m1(String s){
System.out.println("String called");
}
}
现在,以下是案例,
有人可以解释上述情况吗?
答案 0 :(得分:2)
根据传入的表达式的类型,在编译时做出决定。所以
m1("string")
使用String
版本(因为文字的类型为String
)
m1(new String("string"))
使用String
版本,因为表达式new String("string")
的类型为String
所有三个m1(o)
版本都使用Object
版本,因为o
的类型为Object
(根据声明)
再次强调,o
引用的具体类型无关紧要,它是编译器用来确定调用哪个重载的表达式的静态类型。 / p>
这意味着如果更改表达式的类型,则可以使编译器做出不同的选择:
Object o = "string";
m1((String)o); // Calls the String version
JLS的整个部分专门用于方法调用表达式:§15.12: Method Invocation Expressions。相关小节是§15.12.2: Compile-Time Step 2: Determine Method Signature。