java方法重载inheritance和多态
这是我遇到的一个测试练习题,非常感谢您帮助我理解这些概念
让Hawk成为Bird的子类。 假设某些类有两个重载方法void foo(Hawk h)和void foo(Bird b)。 在声明Bird x = new Hawk()之后,将在调用foo(x)中执行哪个版本;
这是我到目前为止的代码,有人可以向我解释为什么foo(鸟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
,因此选择的Third
方法是foo(Bird)
。
这是因为这里不涉及多态性; 我们没有在Bird
变量x
上调用一个可能被重写的方法,我们只是在一个不相关的类上调用一组重载方法, Third
。
在编译时,重载方法的方法调用是根据方法参数的类型和方法参数的编译时(或静态)类型确定的。
在你的情况下, Third#foo(..)
可以拿Hawk
,它可以采取Bird
。 在你的调用中
y.foo(x);
参数x
的编译时(或静态)类型是Bird
,因为它是如何声明的,因此将调用Third#foo(Bird)
方法。