对于ClassOne
来说,ClassTwo
延伸来自classone
,ClassTwo
是子类,ClassTwo hello = new ClassOne();
是超类。如果我去了另一个类并键入:ClassOne
这是否意味着我只能使用ClassTwo
中从ClassOne
继承而来的方法而不是最初使用的方法void eat();
? (例如,名为ClassTwo
的方法位于ClassOne
且void walk();
继承了它,但方法ClassOne
仅位于ClassTwo
而不是hello
所以通过使用{{1}}关键字,我可以访问eat函数而不是walk函数吗?),我不太了解多态的概念。有人可以非常简单地解释一下并举一个例子吗?非常感谢你。
答案 0 :(得分:1)
是的,系统会在可用方法方面将classOne
视为classTwo
。
我喜欢将这些概念视为存储桶,在这种情况下classOne
适合classTwo
存储桶。如果我将classOne
放在classTwo
存储桶中,我只能看到classTwo
存储桶。但是我可以从classOne
桶中挑选classTwo
,也就是说我可以投出它。
这也有助于向上转换和向下转换,即将对象转换为超类型或子类型。你要么把物品放在一个篮子里(向上翻转),要么把它从篮子里拿出来(向下转)。
这个类比可能是垃圾,但它有助于我:)。
要回答您的问题,如果将classOne
投放到classTwo
,则无法对interfaces
中的方法进行方法调用。
这很方便多次。想想{{1}},基本上一个界面告诉你的对象提供一组方法。通过这种方式,我们可以确保调用该对象的每个人都可以使用这些方法,即对象与周围环境的契约。
答案 1 :(得分:0)
这个问题大部分清楚地描述了一个SSCCE,您也可以轻松地自己编写和测试。
类的对象与该类中的方法或字段的关系是“有一个”。
子类型与超类型的关系是“是”。
在ClassTwo hello = new ClassOne();
中,声明的hello
类型为ClassTwo
。右侧表达式使用类型ClassOne
进行评估,但随后会转换为ClassTwo
类型。而ClassTwos没有walk()
。
ClassTwos确实有eat()
,ClassOnes也是如此。当您在ClassOne中声明void eat()
(与其超类具有相同的方法签名)时,会发生魔力。覆盖这样的方法允许在ClassOnes吃掉时发生不同或额外的行为! ......到目前为止,我已经删除了一些你可以继续查找自己的条款。现在我只是声称“吃”这个词在那里被多态地使用了。但这只是一个小例子。我无法封装任何如此抽象但功能强大的概念。