为了账号安全,请及时绑定邮箱和手机立即绑定

为什么继承在 Java 中以这种方式工作?

为什么继承在 Java 中以这种方式工作?

精慕HU 2022-12-15 11:18:36
我是 Java 的新手,我试图通过模拟以下程序来了解当我将子类实例分配给父类实例变量时会发生什么。public class ConfusionWithInheritance {    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        DerievedClass d = new DerievedClass();        BaseClass b = BaseClass.class.cast(d);        BaseClass b1 = new DerievedClass();        b.doSomeJob();        b.printMagic(); //-> Compiler shouted me that it didn't know this method here.    }}class BaseClass {    public void doSomeJob() {        System.out.println("Printing Value X");    }}class DerievedClass extends BaseClass {    public void doSomeJob() {        System.out.println("Printing Value Y");    }    public void printMagic() {        System.out.println("Printing magic...");    }}1) 为什么允许我将子类的实例分配给父类型变量?2)从这个答案中,解释说因为我告诉类的蓝图是 - 父类 - 它只知道父类中的方法。那为什么在调用childInstance.doSomeJob()时打印子类方法中的值呢?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

这归结为编译时间和运行时间之间存在差异。

编译时可用的方法是声明对象的类型中的方法。
运行时,调用的方法是实例化对象的类型中的方法。

因此,对于声明为 BaseClass 类型并实例化为 DerivedClass 类型的对象,可用的方法将是 BaseClass 中的方法,即。doSomeJob(),但调用的方法是 DerivedClass 中的方法。


查看完整回答
反对 回复 2022-12-15
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

创建对象时:

BaseClass b1 = new DerievedClass();

我们要说的是:

ReferenceType variableName = new ConcreteImplementation();

将其视为为新对象提供脚手架的 ReferenceType。

创建对象时,它会查看此 ReferenceType 并创建一个以 ReferenceType 中的所有方法作为骨架的对象。

然后我们看一下方法实现的ConcreteImplementation。所以编译器寻找 ConcreteImplementation 来填充所有方法。

只有在 ReferenceType 中定义的内容才会在最终对象中实现。

将转换视为更改已存在对象的 ReferenceType

随着线:

DerievedClass d = new DerievedClass();

ReferenceType 是 DerievedClass,所以我们从 DerivedClass 中获取所有方法,并用 ConcreteImplementation 中的实现填充它们,即 DerivedClass。

然后我们将 DerievedClass d 转换为 BaseClass b。

BaseClass b = BaseClass.class.cast(d);

d 具有 DerivedClass 的所有实现,但脚手架来自 ReferencType BaseClass,因此我们无法调用 printMagic,因为它不存在于 BaseClass 中。

那有意义吗?

希望能帮助到你


查看完整回答
反对 回复 2022-12-15
  • 2 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号