class A {
}
class B extends A {
public static void main(String args[]) {
B b = new A();
}
}
为什么会抛出编译时错误?为了抑制编译时错误,我们可以B b=(B)new A();
但是它也会通过ClassCastException
。
答案 0 :(得分:4)
B是-A A,但A不是B。
你只能将一个对象分配给它自己的实例或它的超类,而不是它的子类。
答案 1 :(得分:1)
B b = new A() - >因为您无法使用子类型引用引用超类型实例。
B b =(B)new A() - >是的,您可以将其降级为B,因为A和B属于继承层次结构。但是在运行时,因为A是超级类型,所以你不能把它当作B.
在B b =(B)new A()的情况下,编译成功,因为对于向下转换,编译器检查类型是否相关(即继承)但在运行时,您尝试引用超类型对象( A)的对象具有子类型引用(B),因此最终会出现异常。
答案 2 :(得分:0)
根据Dynamic method dispatch,您的超类的对象引用可以指向其子类的对象,反之亦然无效(即不能使子类对象引用指向Super类对象)。
在您的代码 A 是超类,因此可以指向自身和 B 的对象,因为 B 正在扩展 A 。
但是在做B b=(B)new A();
时,你正在进行一次下调。最好的解释就在这里:Class casting in java
如果您将以上所有内容视为类并且圈,则 square 和 triangle 是扩展类 shape <的类/ strong>比形状的对象引用可以指向圆,正方形和三角形的对象更有意义,但是这三个类永远不能指向形状类
的对象答案 3 :(得分:0)
您不能将父类实例化为继承的父类,因为并非所有继承的成员都有机会被初始化。
然而,你可以这样做:A a = new B();因为父亲是B的概括,所有成员都有机会被初始化。