Java/C#面向对象编程练习:类继承关系判断求助
拆解Java代码中的类继承关系
哈哈,这个问题我之前帮好几个开发者梳理过,咱们逐行拆解代码,结合面向对象的转型规则就能搞清楚啦!
逐行分析代码逻辑
咱们基于Java的向上/向下转型规则来推导:
第一行:
C c = new A();
在Java中,只有父类引用可以直接指向子类对象(向上转型,无需强制转换)。这段代码没有强制转换却能合法编译,说明A是C的子类——也就是 A继承自C。如果是C继承自A,那把父类对象赋值给子类引用必须加强制转换,否则直接编译报错,这一步关系就确定了。第二行:
B b1 = (B)(new A());
这里用了强制类型转换,说明A和B必须属于同一条继承链。结合后面的代码来看,合理的关系是 B继承自A:此时A是B的父类,把父类对象new A()强制转成子类B,编译层面是允许的(虽然运行时会抛ClassCastException,但题目只要求符合编译级别的继承关系)。第三行:
B b2 = new D();
同样遵循向上转型规则,B的引用能直接指向D的对象,说明 D继承自B——D是B的子类,这一步非常明确。第四行:
A a = new D();
因为D继承自B,B又继承自A,所以D是A的间接子类,父类A的引用自然能指向子类D的对象,完全符合面向对象的转型规则。
匹配正确选项
对应到给出的选项中,正确答案就是:A继承自C,B继承自A,D继承自B。
内容的提问来源于stack exchange,提问作者Blabla
相关产品推荐
相关产品推荐

