2013-07-29 42 views
2

这更像是一个验证:铸造父类型 - Java的

任何增益铸造子对象的父类型?

假设我有两个类 家长儿童孩子正在延伸父母

是否有 任何区别代码

Parent p = new Child(); 

Parent p = (Parent) new Child(); 

p在调用任何 方法或以任何方式访问其任何成员方面的行为有所不同吗?

从我的结局来看,两者是一样的,在这里投射是多余的。

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

编辑: 我已经作为开发者,正在寻找控制 的方法来调用 - 方法,从外部

因此,编码器将目光调用 家长的方法不管 在子类方法是否被覆盖。也就是说, 子类中重写的方法将被绕过,并且 的实施该方法将被 调用儿童对象。

+0

不在Java中,所有非'private>实例方法都是虚拟的。 – millimoose

+0

[显式类型将子类对象转换为java中的超类]的可能重复(http://stackoverflow.com/questions/12843844/explicit-type-conversion-of-sub-class-object-to-super-class -in-java) –

回答

3

不,不管通过其调用方法的引用类型如何,对象的行为都是相同的。

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

在你的例子中,赋值前的上传不起作用 - 它将作为赋值的一部分隐式发生。

Parent p = (Parent) new Child(); 

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

如果要允许呼叫者选择是否调用父方法或子方法,那么你的API可以提供方法。父母和孩子都可以决定如何支持每个人。

+0

请同时参阅我的编辑。我正在寻找让Child对象偶尔运行Parent方法。 – Roam

+0

@Roam那么你为什么不首先问这个问题呢?不要在目前的问题上移动门柱,只有一个问题要问一个问题。 – millimoose

+0

@millimoose - 在底部查看他的编辑。 –

1

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

+0

第二种方法也可以在父级上定义。这就是说这听起来有点臭的设计 - 如果孩子的方法改变了父母方法的含义,那*应该有一个不同的名字。 – millimoose

+0

我想这就是它。我正在寻找的东西将会受到儿童封装的磨砺。所以,我收集,在那里没有任何灵活性。感谢您的回应。 – Roam

1

它被称为多态性。如果孩子们忽略了一种方法,那么总会有孩子们实施的方式。不管你的变量是什么类型。 仅当其他方法需要投射时 - 如果您想在知道其类型为Child的对象上调用Child方法,但该变量声明为Partent。但它通常是不好的风格来投入变量(也有例外 - 例如equals方法)

+0

我认为几乎任何人在这里听到什么多态性是这样或那样。 – Roam