Java -- 上转型和下转型

首先理解一句话:父类引用指向子类对象;什么意思呢?

记得在刚开始学习面向对象编程时候,经常听老师讲:如果要使用一个类中的成员,就需要先实例化对象,就是说要先创建一个引用类型的对象,就可以使用里边的内容。

比如: Person person = new Person(); 

1、首先,右边的 new Person() ,是以Person类为模板,在堆空间里创建一个Person类对象(也简称为Person对象)。

2、末尾的()意味着,在对象创建后,立即调用Person类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。

3、左边的 Person person 创建了一个Person类引用变量。所谓Person类引用,就是以后可以用来指向Person对象的对象引用。

所以,上边那一句话中的父类引用就是左边的内容,子类对象就是右边的内容,只不过,左边的是父类,右边的类是继承自左边的子类。

向上转型

有一个父类FatherService,有一个子类SonService继承自FatherService

就是 FatherService fatherService = new SonService(); 

这就是父类引用指向子类对象,也叫向上转型,现在fatherService引用指向一个SonService对象

向下转型

再把fatherService给SonService引用,就是向下转型

SonService sonService = (SonService) fatherService; 不过,现在fatherService还是指向SonService对象

所以,向上不需要强制转换,而向下需要

另外,如果父类引用指向父类对象,就不可以向下转型,如下:

FatherService fs = new FatherService();
SonService ss = (SonService) fs;

这样就会报错:com.zg.service.FatherService cannot be cast to com.zg.service.SonService,为什么?

其实“单纯的”父类是不能强转成子类的,这就好比:水果(父类)是苹果(子类)一样,不合逻辑。为啥上边那个可以,这段代码也是我初学时很纳闷的地方,先看 FatherService fatherService = new SonService(); 父类FatherService由子类SonService创建的,之后,子类对象sonService由父类fatherService对象强制转换而来,这个就不是“单纯的”父类了,因为父类引用指向子类对象,它和子类已经构建了联系,这就好比,首先说明了这个水果是苹果(构建了联系),之后说的这个水果,它就是苹果。

总结:

1、父类引用指向子类对象,而子类引用不能指向父类对象

2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换

3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。

原文地址:https://www.cnblogs.com/dcy521/p/14511249.html