Java:除参数类型外,将参数传递给相同的方法签名

时间:2015-11-30 14:44:12

标签: java

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");
  } 
 }

现在,以下是案例,

  • M1( “串”); output:名为
  • 的字符串
  • m1(new String(“string”)); output:名为
  • 的字符串
  • Object o =“string”; M1(○); 输出:对象叫
  • Object o = new String(“string”); M1(○); 输出:对象叫
  • Object o = new Object();     M1(○); 输出:对象叫

有人可以解释上述情况吗?

1 个答案:

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