java方法重载继承和多态

时间:2014-04-11 00:11:26

标签: java inheritance polymorphism overloading

这是我遇到的测试练习题,感谢您帮助我理解概念

让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");
    }


}

2 个答案:

答案 0 :(得分:2)

当Java为选择方法执行重载决策时,它使用该类型的变量而不是对象的运行时类型来选择方法。 x的类型为Bird,因此所选的Third方法为foo(Bird)

这是因为多态性并不在这里;我们并未在Bird变量x上调用可能被覆盖的方法,我们只是在不相关的类Third上调用一组重载方法之一。

答案 1 :(得分:2)

在编译时,重载方法的方法调用是根据方法参数的类型和方法参数的编译时(或静态)类型确定的。

在您的情况下,Third#foo(..)可以HawkBird可能需要y.foo(x); 。在你的调用中

x

参数Bird的编译时(或静态)类型是Third#foo(Bird),因为它是如何声明的,因此将调用{{1}}方法。