关于多态性的一个快速的事情

时间:2013-10-06 22:29:02

标签: java polymorphism

对于ClassOne来说,ClassTwo延伸来自classoneClassTwo是子类,ClassTwo hello = new ClassOne();是超类。如果我去了另一个类并键入:ClassOne这是否意味着我只能使用ClassTwo中从ClassOne继承而来的方法而不是最初使用的方法void eat();? (例如,名为ClassTwo的方法位于ClassOnevoid walk();继承了它,但方法ClassOne仅位于ClassTwo而不是hello所以通过使用{{1}}关键字,我可以访问eat函数而不是walk函数吗?),我不太了解多态的概念。有人可以非常简单地解释一下并举一个例子吗?非常感谢你。

2 个答案:

答案 0 :(得分:1)

是的,系统会在可用方法方面将classOne视为classTwo。 我喜欢将这些概念视为存储桶,在这种情况下classOne适合classTwo存储桶。如果我将classOne放在classTwo存储桶中,我只能看到classTwo存储桶。但是我可以从classOne桶中挑选classTwo,也就是说我可以投出它。

这也有助于向上转换和向下转换,即将对象转换为超类型或子类型。你要么把物品放在一个篮子里(向上翻转),要么把它从篮子里拿出来(向下转)。

这个类比可能是垃圾,但它有助于我:)。

要回答您的问题,如果将classOne投放到classTwo,则无法对interfaces中的方法进行方法调用。

这很方便多次。想想{{1}},基本上一个界面告诉你的对象提供一组方法。通过这种方式,我们可以确保调用该对象的每个人都可以使用这些方法,即对象与周围环境的契约。

也可能重复:Try to describe polymorphism as easy as you can

答案 1 :(得分:0)

这个问题大部分清楚地描述了一个SSCCE,您也可以轻松地自己编写和测试。

类的对象与该类中的方法或字段的关系是“有一个”。

子类型与超类型的关系是“是”。

ClassTwo hello = new ClassOne();中,声明的hello类型为ClassTwo。右侧表达式使用类型ClassOne进行评估,但随后会转换为ClassTwo类型。而ClassTwos没有walk()

ClassTwos确实有eat(),ClassOnes也是如此。当您在ClassOne中声明void eat()(与其超类具有相同的方法签名)时,会发生魔力。覆盖这样的方法允许在ClassOnes吃掉时发生不同或额外的行为! ......到目前为止,我已经删除了一些你可以继续查找自己的条款。现在我只是声称“吃”这个词在那里被多态地使用了。但这只是一个小例子。我无法封装任何如此抽象但功能强大的概念。