为什么转换会确定调用哪个重载方法?

时间:2013-05-12 18:24:39

标签: java

如果java是按值传递,并且该值是实际类型的内存地址,那么为什么被调用的重载方法由引用/声明类型决定?

class Boss {

  void test(Object o){
    System.out.println("object"); 
  }

  void test(Boss b){ 
    System.out.println("boss"); 
  }

  public static void main( String[] args ) {
    Boss b = new Boss();
    b.test((Object)b); //prints out object, why?
  }

}

2 个答案:

答案 0 :(得分:3)

动态绑定适用于调用方法的对象,而不适用于其参数和方法重载。

在这种情况下,该方法在编译时确定为void test(Object o),因为这是与参数类型匹配的重载。

在运行时,test(Object o)的实现是根据调用它的对象选择的。在这种情况下,这是Boss的实现。

举个例子,说你做过这个:

class Director extends Boss { ... }.

Boss d = new Director();
Boss b = new Boss;
d.test((Object)b);

然后就方法重载而言,在编译时选择的方法仍然是test(Object o)。在运行时,实现可以在Director中,因为d引用了Director。

答案 1 :(得分:2)

在编译时决定重载,即编译器决定在编译期间执行哪个方法,而不管在运行时传递给它的对象。由于您传递的参考变量为Object而非Boss,尽管该对象属于Boss,但它会执行重载的void test(Object b)方法。