转换为父类型 - Java

时间:2013-07-29 20:59:25

标签: java inheritance casting

这是一个验证:

将子对象转换为父类型是否有任何增益?

假设我有两个班级 家长孩子儿童正在扩展家长

是否有任何区别 代码

Parent p = new Child();

Parent p = (Parent) new Child();

p 在调用任何内容时会有什么不同的行为 方法或以任何方式访问其任何一个成员?

从我的结尾来看,两者是相同的,在这里铸造是多余的。

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

编辑: 我一直在寻求控制,作为开发人员, 从儿童之外调用哪种方法 - 儿童父母的方法。

因此,编码器会调用 的方法,无论如何 是否在子类中重写该方法。那是, 子类的重写方法将被旁路,并且 该方法的实现将是 在 Child 对象上调用。

3 个答案:

答案 0 :(得分:3)

不,无论您通过何种方式调用方法,对象的行为都会相同。

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

在您的示例中,赋值前的upcast无效 - 它将作为赋值的一部分隐式发生。

Parent p = (Parent) new Child();

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

它被称为多态性。如果孩子覆盖了一个方法,那么将始终调用子实现。无论你的变量是什么类型。 只需要反向转换 - 如果你想在一个对象上调用子方法,你知道它的类型是Child,但是Variable被声明为Partent。但是它通常是糟糕的样式来构造变量(有例外 - 就像equals方法一样)