我在这里有此代码:
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
对象的变量?
答案 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
更改为Dog
。 Dog
始终是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
。