【发布时间】:2018-07-23 03:24:15
【问题描述】:
我这里有这段代码:
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 对象的变量?
【问题讨论】:
-
如果你写
Object x = new Object();,你能把x转换成一个字符串吗?不,你不能,因为它不是字符串。强制转换不会改变 是什么; 它只会改变你的代码识别它的方式。如果您的对象还不是 Dog 实例,则强制转换它不会将其更改为 Dog 实例。你如何选择引用你的对象并不能决定它们实际上是什么。 -
...既然你问了,Java 知道一个对象的内部类型,尽管变量被声明为什么。这就是
instanceof运算符起作用的原因。尽管ani2被声明为Animal,ani2 instanceof Dog仍将返回 true。
标签: java casting polymorphism