Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展类的Java向下转换_Java_Downcast - Fatal编程技术网

扩展类的Java向下转换

扩展类的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 (){

为什么这个代码不起作用?当我铸造时,我得到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 (){
  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,是的。但了解这些细节很有趣