强制类型转换,分为基本数据类型和引用数据类型两种情况,这里探讨后者,即引用类型的强制类型转换。
对于引用类型来说,什么是强制类型转换呢?简单地说,就是把父类型转换为子类型。因为子类型比父类型的内涵要丰富,无非就是属性更多功能更强,所以要把父类型转换为子类型,需要强制,所以叫强制类型转换。那么,是不是只要是父类型的变量就可以转换为子类型呢?事实上不是,这里是有条件限制的。
首先来看发生在什么情况下。
举个例子来说,比如原来定义了两个类型,FatherClass和SonClass,然后构造了一个SonClass类型的对象,用一个FatherClass类型的变量father引用了,就像这样:
FatherClass father = new SonClass(); //自动发生的向上类型转换
那么,需要将这个对象的类型还原的时候,就可以用这个表达式。
SonClass son = (SonClass)father; //向下强制类型转换
其实,father仍然是FatherClass类型,只不过是做了向下强制类型转换。
我们刚才说从父类到子类的强制类型转换并不总是能够成功,那什么时候不能成功呢?
在于这个的对象的真实类型,也就是它是使用什么类的构造方法构造出来的。如果它本身就是父类的类型,那么强制类型转换是不会成功的。
还是举个例子:
FatherClass f = new FatherClass();
SonClass s = (SonClass)f; //这时候就会报错,运行时报错,编译能通过的
编译器只检查类型之间有无继承关系,有则通过;运行时检查真正类型,是则通过。