0

说类ClassOne扩展自ClassTwoclassone是子类,ClassTwo是超类。如果我去另一个班级并输入:ClassTwo hello = new ClassOne();这是否意味着我只能使用ClassOne继承自ClassTwo的方法而不是最初的方法ClassOne?(例如,一个方法被调用void eat();是 inClassTwoClassOne继承了它,但是该方法void walk();只在 inClassOne而不是 in ClassTwoso 通过使用hello关键字,我可以访问eat函数而不是walk函数吗?),我不太了解多态性的概念. 有人可以非常简单地举例说明吗?非常感谢你。

4

2 回答 2

1

是的,这是真的,系统将看到classOne可用classTwo方法。我喜欢将这些概念视为桶,在这种情况下classOne适合classTwo桶。如果我将 aclassOne放入classTwo桶中,我只能看到classTwo桶。classOne但是我可以从classTwo桶中挑选出来,那就是我可以施放它。

这在向上转换和向下转换的情况下也有帮助,即将对象转换为超类型或子类型。您要么将物品放入篮子(向上投射),要么将其从篮子中取出(向下投射)。

这个类比可能是废话,但它对我有帮助:)

要回答您的问题,是的,classOne如果将其强制转换为classTwo.

这很方便,而且好很多倍。想想interfaces,基本上一个接口告诉你的对象提供一组方法。通过这种方式,我们可以确保调用该对象的每个人都可以使用这些方法,即该对象与其周围环境的契约。

也可能重复:尝试尽可能简单地描述多态性

于 2013-10-06T22:40:52.980 回答
0

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

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

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

ClassTwo hello = new ClassOne();中,声明的类型helloClassTwo。右边的表达式用 type 求值,ClassOne但随后被强制转换为 type ClassTwo。并且 ClassTwos 没有walk().

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

于 2013-10-07T01:18:59.740 回答