如果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?
}
}
答案 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)
方法。