• CSDN21天学习挑战赛——多态(05)



    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
    想系统/深入学习某技术知识点…
    一个人摸索学习很难坚持,想组团高效学习…
    想写博客但无从下手,急需写作干货注入能量…
    热爱写作,愿意让自己成为更好的人…

    什么是多态?

    指对象可以有多种形态。

    多态的常见形式

    父类类型 对象名称 = new 子类构造器

    多态中成员访问特点

    方法调用:编译看左边,运行看右边。
    变量调用:编译看左边,运行也看左边。(注意)

    多态的前提

    有继承/实现关系;有父类引用指向子类对象;有方法重写(多态侧重行为多态)。

    优势

    在多态形式下,右边对象可以实现解耦合,便于扩展和维护。

    Animal a = new Dog();
    a.run(); // 后续业务行为随对象而变,后续代码无需修改
    
    • 1
    • 2

    定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。

    多态下会产生的一个问题:

    多态下不能使用子类的独有功能

    自动类型转换(从子到父):

    Animal c = new Cat();
    
    • 1

    强制类型转换(从父到子)

    从父到子( 必须进行强制类型转换,否则报错): 子类 对象变量 = (子类)父类类型的变量
    作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
    注意: 有继承/实现关系的类就可以在编译阶段进行强制类型转换;但是,如果转型后的类型和对象真实对象的类型不是同一种类型,那么在运行代码时,就会出现ClassCastException

    Animal c = new Cat();
    Dog d = (Dog)c; // 出现异常 ClassCastException
    
    • 1
    • 2

    Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换

    变量名 instanceof 真实类型
    判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true,反之。

    总结

    1、引用数据类型的类型转换,有几种方式?
    自动类型转换、强制类型转换。
    2、强制类型转换能解决什么问题?
    可以转换成真正的子类类型,从而调用子类独有功能。
    3、强制类型转换需要注意什么?
    有继承关系/实现的2个类型就可以进行强制转换,编译无问题。
    运行时,如果发现强制转换后的类型不是对象真实类型则报错(ClassCastException)
    4、强制类型转换前最好做什么事情,如何进行?
    使用instanceof判断当前对象的真实类型,再进行强制转换
    对象变量名 instanceof 真实类型

  • 相关阅读:
    百科不全书之 docker记录
    CycloneNTT:需要更少内存的butterfly FFT方案
    2023年上半年系统集成项目管理工程师什么时候报考?(附具体报名步骤)
    Lua脚本详解
    ​力扣解法汇总1413-逐步求和得到正数的最小值
    极限多标签之FastXML
    Cell:代谢组学肠道微生物群介导生酮饮食的抗癫痫作用
    汽车技术市场动态分析
    Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)
    Linux基础知识总结篇
  • 原文地址:https://blog.csdn.net/rej177/article/details/126244108