扩展类的Java向下转换
为什么这个代码不起作用?当我铸造时,我得到ClassCastXeption 线程主java.lang.ClassCastException中出现异常:无法将A转换为B 在HelloWorld.main扩展类的Java向下转换,java,downcast,Java,Downcast,为什么这个代码不起作用?当我铸造时,我得到ClassCastXeption 线程主java.lang.ClassCastException中出现异常:无法将A转换为B 在HelloWorld.main public class HelloWorld { public static void main(String[] args) { B b1 = (B)new A(); b1.a(); } } public class A { public void a (){
public class HelloWorld
{
public static void main(String[] args)
{
B b1 = (B)new A();
b1.a();
}
}
public class A
{
public void a (){
System.out.println("A.a");
}
public void b (){
System.out.println("A.b");
}
}
public class B extends A{
}
铸造不能总是以两种方式进行 如果您正在创建一个动物,通过调用new Animal,您正在创建一个动物对象,但它不能降级为Dog。因为它不是狗 然而,当你们通过调用新狗来创建一只狗时,你们可以将它向上投射到动物身上,向下投射到狗身上
Dog dog = new Dog();
Animal animal = dog; //upcasting to Animal
if(animal instanceof Dog){ // testing if the Animal is a Dog
Dog dog2 = (Dog) animal; //downcast
}
因为你不能将A转换为B。我建议你阅读继承的基础知识和它的工作原理。你不能将父转换为子……你声明B是A的一种。这并不意味着A是B的一种。然后你说“这是A是B”。编译器抱怨。你可能想让它反过来:A b1=新B;b1.a@pvg编译器没有抱怨。JVM会的。啊哈!非常感谢。只有在向上投射之后才能向下投射!现在清楚了@卡什尼科夫,而且无论如何都不应该被使用。对!为了更好地理解这一点,他应该更多地练习java中的继承概念。@chrylis,是的。但了解这些细节很有趣