Java中对super class执行typecasting转为sub class为何需要显式操作?
Java 父类转子类需要显式typecasting的原因
首先这个规则和基本类型宽转窄需要显式强转的底层逻辑一致:转换操作本身不安全,存在运行时出错的风险,编译器无法默认操作合法,必须由开发者显式声明确认风险自行承担。
和你猜想的内存特性有一定关联,但核心原因是**super class引用指向的实际对象类型存在不确定性**:
super class的引用可以指向三种类型的实例:super class自身的实例、任意一个sub class的实例sub class通常会定义父类不存在的独有属性、方法,如果super class引用实际指向的不是当前要转换的sub class类型实例,转换后调用sub class的独有成员会直接运行报错。
你可以参考下面的示例代码理解:
// 父类 class Animal {} // 子类1 class Dog extends Animal { // 子类独有方法 public void bark() { System.out.println("汪汪叫"); } } // 子类2 class Cat extends Animal {} public class CastTest { public static void main(String[] args) { // 父类引用实际指向Cat类实例 Animal animal = new Cat(); // 必须显式强转编译器才会放行,但运行时依然会抛出ClassCastException Dog dog = (Dog) animal; // 如果没有运行时异常,调用子类独有方法时也会因为找不到对应成员崩溃 dog.bark(); } }
你提到的内存特性是次要的关联原因:super class实例的内存布局只包含自身定义的成员,没有sub class新增成员对应的内存空间,如果直接将super class实例强转为sub class,访问子类独有成员时会读取到无效内存数据,也会导致运行错误。
内容的提问来源于stack exchange,提问作者Ramzi Bouali
相关产品推荐
相关产品推荐

