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

时间:2018-07-23 03:24:16

标签: 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对象的变量?

2 个答案:

答案 0 :(得分:2)

VGR说的是正确的,您无法更改某些内容。强制转换仅在这里用来帮助我们的代码在编译期间识别出它是什么。

考虑ff示例:

Animal ani1 = new Cat();
Animal ani2 = new Dog();

Dog dog1 = (Dog) ani1; // will produce a runtime error
Dog dog2 = (Dog) ani2;

就像给定的示例一样,您不能简单地通过强制转换将Cat更改为DogDog始终是Animal,但是Animal不能始终是Dog

答案 1 :(得分:2)

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