Java 多态转换 - 运行时错误 ClassCastException

标签 java casting polymorphism

我这里有这段代码:

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 。但令我困惑的是 ani1ani2类型为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/

相关文章:

java - RecyclerView 中多个对象出现错误

java - 为什么它没有进入 if 条件?

java - 尝试在 Eclipse Luna 中运行反编译器

私有(private)嵌套类中的 Java 作用域修饰符

java - 在对 JSP 隐式对象的属性进行强制转换时,我应该添加 try/catch around 吗?

swift - 为什么在 Swift 中自动向上转换很好

java - (int) Math.sqrt(n) 比 (int) Math.floor(Math.sqrt(n)) 慢很多

c# - 类型接口(interface) C# 的集合

java - 在父类之间来回转换后,子对象是否会丢失其独特的属性

c++ - C++中的纯虚析构函数