为什么在这个例子中没有调用子类方法,因为它在Java中的动态多态中被调用?

时间:2017-02-25 11:03:09

标签: java inheritance

我做了一些研究,但我无法找到为什么运行时多态性没有在下面的例子中发生。 根据我的理解,foo(int a)应该在child中被调用。但是put out是" Parent with long"。有人可以点亮这个吗?

Tracker.autorun

输出:

父级长

4 个答案:

答案 0 :(得分:2)

多态性仅适用于方法具有完全相同的签名(相同数量和类型的参数)的情况。

答案 1 :(得分:2)

您拥有的Parent有两种方法:foo(long)foo()。并且Child继承自其父级并添加两个新的不同方法:foo(int)和(那个重载现有方法)foo()(那个覆盖了继承的方法) )。

有不同的机制:在编译时会发生什么,以及在运行时会发生什么。在编译时,编译器只会相应地查看变量类型。在运行时,执行环境。将查看对象类型。

现在编译调用p.foo(a)时,编译器将查看p的类型,即Parent,并在Parent类中查找相应的可调用方法。它找到foo(long),然后生成对方法foo(long)的动态调用,从intlong转换为运行时的真实对象(类型为Child} )。但是这个对象只有一个这样的方法,Parent中的方法,所以这个方法将被调用。

Child的{​​{1}}更改为foo(int),您将拥有自己想要的内容。

答案 2 :(得分:0)

正如你所说的多态性是正确的。你看到的是编译时多态,它正在重载。

Child的方法已经在编译时决定,因为在父级中没有定义等效方法,也没有应用ovveriding(运行时多态)。

答案 3 :(得分:0)

在java中,多态性工作在自上而下的机制中..你看..当你创建子对象时,你是创造一个专利对象的现实......当你的孩子延伸到专利时它永远不会出错。那么..你实际上是在创建一个专利对象..根本不是一个子对象..这就是为什么它正在执行父方法...如果你想看看多态如何工作..那么只需创建Child object = new Child() 。 然后传递Long或int变量.. 希望有所帮助