对象类型的转换
对象类型的转换包括向上类型转换与向下类型转换。
1、向上类型转换
将子类对象赋值给父类类型的变量,这种技术称为“向上转型”。
在面向对象中越上层的类越抽象,越下层的类越具体,越具体的类具有越多的特性,由于向上转型是将较具体的类转到较抽象的类,所以它总是安全的。
2、向下类型转换
将父类对象赋值给子类类型的变量,这种技术称为“向下转型”。
由于是将较抽象的类转为较具体的类,这样的转型比较危险。子类对象总是父类的一个实例,父类对象不一定是子类的实例。子类总是具有父类的特性,子类具有的特性父类不一定具有。
回想一下平行四边形、矩形、正方形具有的特性:
平行四边形 | 矩形 | 正方形 |
①两组对边平行且相等 | ①两组对边平行且相等 | ①两组对边平行且相等 |
②有一个角是直角 | ②有一个角是直角 | |
③四条边相等 |
越下层的类越具体,越具体的类具有的特性越多。向上转型之所以是安全的,因为子类具有父类所有的特性。在程序中进行向下转型时,必须使用显示类型转换,向编译器说明要将父类对象转换为哪一类型的子类对象。
在程序中,引用存储着对象的内存地址,父类的引用能够存储父类及其子类对象的地址,对于到底存储的是父类对象的地址子类对象的地址引用并不知晓。比如,平行四边形类的引用只知道自己保存的地址是一个平行四边形的地址,具体是矩形还是正方形它并不知道。
在程序中,如果需要将父类引用的值(也就是父类或者其子类对象的地址)赋值给某个子类的引用,需要告诉编译器:“我给的地址就是这个子类的对象的地址”,否则编译无法通过。
需要注意,父类引用存储的地址到底是父类对象的地址还是某个子类对象的地址,完全是我们告诉编译器的(显示类型转换),即使编译能够通过,但还是不能保证程序运行的时候不会出错。即使我们将平行四边形类引用存储的矩形对象的地址赋值给正方形类引用,我们也能告诉编译器,这就是一个正方形的地址,编译是能够通过的,但如果我们真把矩形当作正方形进行操作还是会出错。
所以说,向下类型转换是危险的。