4

这更像是一个验证:

将子对象转换为父类型有什么好处吗?

假设我有两个类 ParentChildChild正在扩展Parent

代码有什么不同吗

Parent p = new Child();

Parent p = (Parent) new Child();

?

p在调用它的任何方法或以任何方式访问它的任何一个成员时会有什么不同吗?

从我的角度来看,两者是相同的,这里的铸造是多余的。

//===================================

编辑:作为开发人员,我一直希望能够从 Child 外部控制调用哪个方法—— Ch ​​ildParent方法

因此,编码器将寻求调用Parent的方法,而不管该方法是否在子类中被覆盖。也就是说,子类的重写方法将被绕过,并且该方法的Parent实现将在Child对象上调用。

4

3 回答 3

6

不,无论您调用该方法的引用类型如何,对象的行为都会相同。

这是设计使然 - 它允许子类覆盖其超类的方法。

在您的示例中,分配之前的向上转换没有任何效果-它将作为分配的一部分隐式发生。

Parent p = (Parent) new Child();

调用者不能强制对象忽略其方法覆盖。这是一件好事。否则,孩子永远无法强制执行自己的内部不变量。

如果你想让调用者选择是调用父方法还是子方法,那么你的 API 可以提供两种方法。父母和孩子都可以决定如何支持每个人。

于 2013-07-29T21:08:10.873 回答
1

回答你的第二个问题:这在设计上是不可能的。如果父方法被子方法覆盖,则无法调用父方法,除非通过子代码中的代码。如果孩子想要允许这样做,您可以提供另一个使用 super 调用覆盖的父方法的方法。当然,第二种方法需要有一个不同的名称。

于 2013-07-29T21:12:49.870 回答
1

它被称为多态性。如果孩子覆盖了一个方法,那么总是会调用孩子的实现。无论您的变量是什么类型。只有在相反的情况下才需要强制转换 - 如果您想在知道其类型为 Child 但变量声明为 Partent 的对象上调用子方法。但是强制转换变量的方式通常很糟糕(也有例外——比如 equals 方法)

于 2013-07-29T21:17:48.910 回答