2 回答
TA贡献1966条经验 获得超4个赞
这归结为编译时间和运行时间之间存在差异。
在编译时,可用的方法是声明对象的类型中的方法。
在运行时,调用的方法是实例化对象的类型中的方法。
因此,对于声明为 BaseClass 类型并实例化为 DerivedClass 类型的对象,可用的方法将是 BaseClass 中的方法,即。doSomeJob(),但调用的方法是 DerivedClass 中的方法。
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 中。
那有意义吗?
希望能帮助到你
添加回答
举报
