在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。
Object x = new Integer(0);
Number y = (Number)x; //正确
父类引用x指向子类对象,多态。
x在内存中的本质还是Integer类型,所以可以强转。
Integer x = new Integer(0);
String y = (String)x; //编译时报错,不兼容的类型
Object x = new Object();
Number y = (Number)x; //运行时抛出ClassCastException异常
编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。