class Animal {
public String noise() {
return "peep";
}
}
class Dog extends Animal {
public String noise() {
return "bark";
}
}
class Cat extends Animal {
public String noise() {
return "meow";
}
}
class jk{
public static void main(String args[]){
Animal animal = new Dog();
Cat cat = (Cat)animal;//line 23
System.out.println(cat.noise());
}
}
当我编译此代码时,它在第23行显示ClassCastException。我无法理解问题是什么。帮助!!
答案 0 :(得分:1)
当对象转换为数据类型时,JVM抛出ClassCastException 该对象不是。的实例。
例如
//Compile Error
Integer x = new Integer(10);
String y = (String) x;
//OK
Object x = new Integer(10);
String y = (String) x;
要避免 ClassCastException ,您可以使用 instanceof
Object x = new Integer(10);
if(x instanceof String)
{
String y = (String) x;
}
我希望你能得到充分理解。谢谢。
答案 1 :(得分:1)
问题是您正在尝试将更具体的类型转换为不太具体的类。更简单地说,猫或狗可以是动物,因此您可以将狗和猫声称为动物,如下所示:
Animal cat = new Cat();
Animal dog = new Dog();
然而,您不能将动物称为猫或狗,因此以下声明无效
Cat cat = new Animal();
Dog dog = new Animal();
Cat cat = new Dog();
Dog dog = new Cat();
原因很简单,那是因为在这种情况下,像猫或狗这样的更具体的类可能有更多的方法/实例变量,在更一般的情况下不存在。动物应该拥有所有动物共有的属性和方法,但猫或狗可能会做一些并非所有动物都可以使用的东西。
在一个坚果shell中,你不能引用带有子类引用的超类对象。