1

如果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?
  }

}
4

2 回答 2

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。

于 2013-05-12T18:26:32.377 回答
2

重载是在编译时决定的,即编译器决定在编译期间正确执行哪个方法,而不考虑在运行时传递给它的对象。并且由于您传递的引用变量 ofObject和 not Boss,尽管对象是 of Boss,但它会执行重载void test(Object b)方法。

于 2013-05-12T18:27:56.523 回答