我做了一些研究,但我无法找到为什么运行时多态性没有在下面的例子中发生。 根据我的理解,foo(int a)应该在child中被调用。但是put out是" Parent with long"。有人可以点亮这个吗?
Tracker.autorun
输出:
父级长
答案 0 :(得分:2)
多态性仅适用于方法具有完全相同的签名(相同数量和类型的参数)的情况。
答案 1 :(得分:2)
您拥有的Parent
有两种方法:foo(long)
和foo()
。并且Child
继承自其父级并添加两个新的不同方法:foo(int)
和(那个重载现有方法)foo()
(那个覆盖了继承的方法) )。
有不同的机制:在编译时会发生什么,以及在运行时会发生什么。在编译时,编译器只会相应地查看变量类型。在运行时,执行环境。将查看对象类型。
现在编译调用p.foo(a)
时,编译器将查看p
的类型,即Parent
,并在Parent
类中查找相应的可调用方法。它找到foo(long)
,然后生成对方法foo(long)
的动态调用,从int
到long
转换为运行时的真实对象(类型为Child
} )。但是这个对象只有一个这样的方法,Parent
中的方法,所以这个方法将被调用。
将Child
的{{1}}更改为foo(int)
,您将拥有自己想要的内容。
答案 2 :(得分:0)
正如你所说的多态性是正确的。你看到的是编译时多态,它正在重载。
Child的方法已经在编译时决定,因为在父级中没有定义等效方法,也没有应用ovveriding(运行时多态)。
答案 3 :(得分:0)
在java中,多态性工作在自上而下的机制中..你看..当你创建子对象时,你是创造一个专利对象的现实......当你的孩子延伸到专利时它永远不会出错。那么..你实际上是在创建一个专利对象..根本不是一个子对象..这就是为什么它正在执行父方法...如果你想看看多态如何工作..那么只需创建Child object = new Child() 。 然后传递Long或int变量.. 希望有所帮助