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行代码)

总结:

父类不能直接强转成子类,除非父类是由该子类创建而来的!

posted @ 2018-11-03 23:55  小强屋  阅读(6900)  评论(0编辑  收藏  举报