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)方法。