说类ClassOne
扩展自ClassTwo
,classone
是子类,ClassTwo
是超类。如果我去另一个班级并输入:ClassTwo hello = new ClassOne();
这是否意味着我只能使用ClassOne
继承自ClassTwo
的方法而不是最初的方法ClassOne
?(例如,一个方法被调用void eat();
是 inClassTwo
并ClassOne
继承了它,但是该方法void walk();
只在 inClassOne
而不是 in ClassTwo
so 通过使用hello
关键字,我可以访问eat函数而不是walk函数吗?),我不太了解多态性的概念. 有人可以非常简单地举例说明吗?非常感谢你。
2 回答
是的,这是真的,系统将看到classOne
可用classTwo
方法。我喜欢将这些概念视为桶,在这种情况下classOne
适合classTwo
桶。如果我将 aclassOne
放入classTwo
桶中,我只能看到classTwo
桶。classOne
但是我可以从classTwo
桶中挑选出来,那就是我可以施放它。
这在向上转换和向下转换的情况下也有帮助,即将对象转换为超类型或子类型。您要么将物品放入篮子(向上投射),要么将其从篮子中取出(向下投射)。
这个类比可能是废话,但它对我有帮助:)
要回答您的问题,是的,classOne
如果将其强制转换为classTwo
.
这很方便,而且好很多倍。想想interfaces
,基本上一个接口告诉你的对象提供一组方法。通过这种方式,我们可以确保调用该对象的每个人都可以使用这些方法,即该对象与其周围环境的契约。
也可能重复:尝试尽可能简单地描述多态性
这个问题很清楚地描述了一个SSCCE,您也可以轻松地编写和测试自己。
类的对象与该类中的方法或字段的关系是“具有”。
子类型与超类型的关系是“is a”。
在ClassTwo hello = new ClassOne();
中,声明的类型hello
是ClassTwo
。右边的表达式用 type 求值,ClassOne
但随后被强制转换为 type ClassTwo
。并且 ClassTwos 没有walk()
.
ClassTwos 确实有一个eat()
,ClassOnes 也有。当您还在void eat()
ClassOne 中声明(使用与其超类相同的方法签名)时,魔法就会发生。像这样重写方法允许在 ClassOne 吃东西时发生不同或额外的行为!... 到目前为止,我已经删除了一些您可以继续自己查找的术语。现在我只声称“吃”这个词在那里被多态地使用。但这只是一个小例子。我无法封装任何如此抽象但强大的概念。