转换为父类型--Java

转换为父类型--Java,java,inheritance,casting,Java,Inheritance,Casting,这是一种验证: 将子对象强制转换为父类型是否有任何收益 假设我有两门课 家长和孩子子项正在扩展父项 这两者有什么区别吗 代码 Parent p = new Child(); 及 ? p在调用其 方法或以任何方式访问其任何一个成员 从我的角度来看,这两个角色是相同的,这里的角色是多余的 //================================== 编辑: 我一直在寻找控制权,作为开发者, 在哪个方法上调用--子方法或父方法,从外部调用子方法 因此,编码人员将希望调用 父项的方法不考虑

这是一种验证:

将子对象强制转换为父类型是否有任何收益

假设我有两门课 家长孩子子项正在扩展父项

这两者有什么区别吗 代码

Parent p = new Child();

?

p在调用其 方法或以任何方式访问其任何一个成员

从我的角度来看,这两个角色是相同的,这里的角色是多余的

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

编辑: 我一直在寻找控制权,作为开发者, 在哪个方法上调用--子方法父方法,从外部调用子方法

因此,编码人员将希望调用 父项的方法不考虑 是否在子类中重写该方法。就是, 子类的重写方法将被旁路,并且 该方法的父级实现将是
在子对象上调用

否,无论调用方法的引用类型如何,对象的行为都是相同的

这是设计的——它允许子类重写其超类的方法

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

Parent p = (Parent) new Child();
调用方不能强制对象忽略其方法重写。这是一件好事。否则,子对象永远无法强制执行自己的内部不变量


如果希望允许调用方选择调用父方法还是子方法,则API可以提供两种方法。父母和孩子都可以决定如何支持他们

回答你的第二个问题:这在设计上是不可能的。如果父方法被子方法重写,则除了从子方法中的代码中重写外,无法调用该父方法。如果子级希望允许这样做,则可以提供另一个方法,该方法使用super调用重写的父方法。当然,第二种方法需要有不同的名称。

它被称为多态性。如果child重写了一个方法,那么将始终调用child implementation。无论变量是什么类型。
只有在另一种情况下才需要强制转换——如果您想在一个对象上调用子方法,您知道该对象的类型是Child,但变量被声明为Partent。但是强制转换变量通常是不好的方式(也有例外,比如equals方法)

请参见我的编辑。我想让Child对象偶尔运行Parent方法。@Roam那么你为什么不先问一下呢?不要在现有问题上移动门柱,只有一个问题可以问一件事。@我的观点是,他们要么移动门柱,要么提出综合问题。或者至少是一个不清楚的问题,在阐述了另一个问题之后,实际问题被隐藏在编辑中。所有的方法都是不可取的——如果有点不可取的话,这就是为什么我所做的只是将问题指向OP。而不是在Java中,所有的非私有实例方法都是虚拟的。第二个方法的可能副本也可以在父方法上定义。也就是说,这听起来像是一个有点臭的设计——如果孩子的方法改变了父母的方法的含义,那应该有一个不同的名称。我想这就是它。我要找的是Child的封装。因此,我推测,这里没有任何形式的灵活性。谢谢你的回复。我想这里几乎每个人都听说过多态性是什么。
Parent p = (Parent) new Child();