我这里有这段代码:
public class code {
public static void main(String args[]){
Animal ani1 = new Animal();
Animal ani2 = new Dog();
Dog d1 = (Dog)ani1; //runtime error ClassCastException
Dog d2 = (Dog)ani2;
}
}
class Animal {
public String name = "animal";
public void talk(){
System.out.println("Animal");
}
}
class Dog extends Animal {
public String name = "dog";
public void talk(){
System.out.println("Dog");
}
}
我不明白为什么会发生运行时错误并通常会导致向下转型。正在创建 2 个对象,一个 Animal
对象和一个Dog
目的。每个都由 Animal
类型的变量引用。 。
我认为Java不会分配d1
Animal
类型的对象因为d1
被声明为类型 Dog
。但令我困惑的是 ani1
和ani2
类型为Animal
,并且应该能够向下转换为 Dog
正确的?唯一的区别是引用的是 Animal
对象和另一个Dog
目的。
Java 知道 ani1
正在引用 Animal
反对并且不允许 d1
被分配一个引用 Animal
的变量对象?
最佳答案
comment by VGR是正确的,但让我针对您的具体情况详细说明。狗是一种动物,但动物不一定是狗。您可以创建 Dog
对象并将它们作为 Animal
对象传递,但反之则不然。处理此问题的常见方法如下:
public static void main(String args[]) {
Dog dog = new Dog();
makeMeTalk(dog);
}
public static void makeMeTalk(Animal animal) {
animal.talk();
}
其输出将是:Dog
。
关于Java 多态转换 - 运行时错误 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51471208/