强制类型转换分为数据类型转换和引用类型转换,这里只讲后者。以一个具体事例为例。
下面是乐器类及它的子类的继承关系图:
Instrument instrument=new Violin();
//子类的父类引用,用父类引用的方式建立子类对象实例。
由于继承性,子类可以自动转换为父类。虽然Violin对象实例被向上转型为Instrument了,但是这个Violin对象实例在内存中的本质还是Violin类型的。
Violin v=(Violin)instrument;
//将instrument强制转换为Violin类型.
由于instrument对象是用子类的父类引用方式建立的,这个对象实例的Violin类型被临时削弱了。所以需要进行强制转换才能变成Violin类型。
Brass b=(Brass)instrument;
//将instrument强制转换为Brass类型
运行报错:
Exception in thread "main" java.lang.ClassCastException: Violin cannot becast to Brass
at Music.main(Music.java:18)
为什么会报错呢?由于instrument的本质是Violin类型,Brass既不是Violin的子类不是它的父类,所以无法进行强制转换。
总结:
1、 向上强制转换是被允许的。
2、 向下强制转换的类必须是目前引用类型某个子类,并在编译时检查。
3、 如果运行时错误会发生,运行时会检查对象类型。