y = (B)x;//x向下强制转型成它的子类,是允许的啊x = y;//x = (A)y是可以的,但这样不可以z = x;//同y = (B)x一样z = (C)y;//两个子类根本就不相关y = (A)y;//(A)y以后,实际类型A,但形式类型是B,不可以这样赋值

解决方案 »

  1.   

    我上面的解释有错误,重新翻了一下书:在OOP思想中,关于转型有两种:1、一种是向上转型(upcating),就是将子类的Reference转为父类的Reference
    向上转型会遗失子类的某些方法。子类可以“没有明确表示转型“或“没有指定特殊的标记”的情况下,编译器允许向上转型,也就是说其实上面的x = y其实是可以编译通过的.2、另外一种是向下转型(downcating),就是将父类的Reference转为子类的Reference.
    向下转型可以取回型别的信息。向上转型完全安全,而向下则必须保持向下转型的安全,Java在检查这个安全的时间的动作(在执行时期检验类型)就叫:run-time type identification RTTI(执行期类型识别).所以在上面的y = (B)x的时间会在编译的时间出错(cause a runtime exception)
      

  2.   

    在Java中RTTI是一个很大的议题,你可以去看一下RTTI的书,《Thinking In Java》在12章专门开了一章讲这个议题。
      

  3.   

    1) x = y; //编译器允许,运行的时间也是可以的
    2) z = x; //没有执行类型的强制转换,不能在不同的类间相互赋值,无法编译
    3) y = (B) x; //执行了向下转型,可以编译,运行的时间RTTI,运行的时间报错
    4) z = (C) y; //C和B没有一点关系,不可以强制类型转换,无法编译
    5) y = (A) y; //强制转换以后,分属两个不同的类,不可以相互赋值,无法编译
      

  4.   

    上面的解释比较正确这类题目(选出会产生Runtime Exception)的选项一般都有这么几项是无法编译的,注意运行时和编译这两个的区别,一般就可以解决问题。