这是我遇到的测试练习题,感谢您帮助我理解概念
让Hawk成为Bird的子类。假设某个类有两个重载方法void foo(Hawk h)和void foo(鸟b)。在之后的调用foo(x)中将执行哪个版本 声明Bird x = new Hawk();
这是我到目前为止的代码,有人可以向我解释为什么foo(bird b)被执行了吗?
public class MPractice {
public static void main(String args[]) {
Bird x = new Hawk();
Third y = new Third();
y.foo(x);
}
}
public class Third {
void foo(Hawk h) {
System.out.println("Hawk");
}
void foo(Bird b) {
System.out.println("Bird");
}
}
答案 0 :(得分:2)
当Java为选择方法执行重载决策时,它使用该类型的变量而不是对象的运行时类型来选择方法。 x
的类型为Bird
,因此所选的Third
方法为foo(Bird)
。
这是因为多态性并不在这里;我们并未在Bird
变量x
上调用可能被覆盖的方法,我们只是在不相关的类Third
上调用一组重载方法之一。
答案 1 :(得分:2)
在编译时,重载方法的方法调用是根据方法参数的类型和方法参数的编译时(或静态)类型确定的。
在您的情况下,Third#foo(..)
可以Hawk
,Bird
可能需要y.foo(x);
。在你的调用中
x
参数Bird
的编译时(或静态)类型是Third#foo(Bird)
,因为它是如何声明的,因此将调用{{1}}方法。