我有一个班级动物有一个孩子狗。
class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
super.makeSound();
}
}
public static void main(String[] args) {
Dog dog = (Dog) new Animal(); // It compiles, but throws runtime exception.
dog.makeSound();
}在这里,如果我们将子转换为父类,它将编译,但它将抛出运行时异常- ClassCastException。当然,在某些情况下,孩子会有父母没有的字段或方法,这就是为什么我们不能把狗扔给动物的原因。而且,这里没有-一段关系。但是,在父类和子类只有相同的字段和方法的情况下,为什么不能进行强制转换?
我在面试中被问到这个问题)
谢谢。
发布于 2022-03-24 19:29:14
当编译器看到你试图把动物对象转换成狗的时候,它“知道”狗在层次结构的下面,所以它有可能是狗,所以它允许它。然而,在运行时,它只是一个动物,而不是狗,所以转换失败。
这是一个奇怪的例子,在阅读程序时,很明显,动物只是动物,而不是狗,因为它是用“新动物()”创建的,但是编译器不知道--它只知道它是动物。编译器很聪明,但他们不可能什么都知道。我希望这是有意义的。
https://stackoverflow.com/questions/71607645
复制相似问题