这是我遇到的一个测试练习问题,希望您能帮助我理解概念
让Hawk成为Bird的子类.假设某个类有两个重载的方法void foo(Hawk
h)和void foo(Bird 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");
}
}
解决方法:
Java执行重载解析以选择方法时,它将使用该类型的变量而不是对象的运行时类型来选择方法. x的类型是Bird,所以选择的第三个方法是foo(Bird).
这是因为这里不涉及多态性.我们不会在Bird变量x上调用可能被覆盖的方法,而只是在不相关的类Third上调用一组重载方法中的一个.