【发布时间】:2017-02-06 05:45:49
【问题描述】:
假设我们有一个类 Animal 扩展到其他三个类:Dog、Cat、Bird。
这个动物类有一个talk() 和move() 函数。 talk 函数输出“Animal talk”,move 函数输出“Animal Moving”。
对于狗来说,这是“狗移动”和“狗吃”。对于Cat 和Bird 类,这种差异与“猫移动”等类似。
现在,由于多态性,如果我这样做了
Animal charlietheBird = new Bird()
然后调用
charlietheBird.talk()
它会输出
鸟语花香
因为输出是在运行时确定的,因为编译器知道 charlie 是 Bird 类的 Animal 类型。
但是!!
我可以做到
Bird charlietheBird = new Bird();
然后调用charlietheBird.poop(); 将给出相同的输出,因为
方法会被覆盖。
【问题讨论】:
-
多态是一个概念。继承(连同虚函数)是实现该概念的技术手段。所以标题中的问题有点无关紧要。
-
你基本上是对的。当您的程序中有 234 只猫、一只狗和 5000 只鸟时,如果您有时可能希望其中一只说话或移动而不关心您正在处理的动物的确切类型,那么将某些鸟声明为
Animal的优势就来了。 -
@silenceislife 我相信你的问题大致可以转化为如果我们有继承,为什么我们需要多态。有关 Polymorphism 可以做什么的详细说明,请参阅我的回答。
-
@barakmanos 继承不是和多态一样也是一个概念吗?或者更确切地说,在技术上是否实现了多态性?多态性和继承都需要以特定方式构造代码,对吗?
标签: java oop inheritance design-patterns polymorphism