• 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),要强制转换。

  • 相关阅读:
    〖Linux〗秒开www.stackoverflow.com,非代理方式
    〖Linux〗git push orgin master不能解析域名的解决方法
    unity, terrain道出为obj
    unity, 顶点对齐
    world machine, 输出lightmap
    unity, scene视图查看场景时应调成正交模式
    unity, 由scriptableObject创建.asset
    unity, 播放循环背景音乐注意事项
    用audacity制作循环背景音乐
    unity, 保存prefab时material丢失问题
  • 原文地址:https://www.cnblogs.com/dcy521/p/14511249.html
Copyright © 2020-2023  润新知