Java中父类与子类的转换问题
先看个例子:
1 class A { 2 public A() { 3 } 4 } 5 6 class B extends A { 7 public B() { 8 super(); 9 } 10 }
上面定义了两个类,一个是类A,一个是由A派生而来的类B
再看主函数的代码:
public class TestDemo { public static void main(String[] args) { B b = new B(); A a = new A(); a = b; } }
这个不报错,也符合我们的逻辑,子类赋值给父类,就好比苹果(子类)是水果(父类)一样。
接下来才是重点:
public class TestDemo { public static void main(String[] args) { B b = new B(); A a = new A(); b=(B) a; } }
这段代码在编译时期不会出错,但运行时期却报错了:
Exception in thread "main" java.lang.ClassCastException: com.laowu.A cannot be cast to com.laowu.B
报错说:A类不能转换成B,为什么?其实“单纯的”父类是不能强转成子类的,这就好比:水果(父类)是苹果(子类)一样,不合逻辑。
但是下面这段代码编译和运行都不会出错:
1 public class TestDemo { 2 3 public static void main(String[] args) { 4 B b = new B(); 5 A a = new B(); 6 b = (B) a; 7 } 8 9 }
这段代码也是我初学时很纳闷的地方,但仔细想想就理解了,先看第5行代码,父类A由子类B创建的,之后第6行代码,子类对象b由父类a对象强制转换而来,这个就不是“单纯的”父类了,因为它和子类已经构建了联系
这就好比,首先说明了这个水果是苹果(构建了联系,第5行代码),之后说的这个水果,它就是苹果(第6行代码)