• 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 真实类型

  • 相关阅读:
    SpringCache和Redis结合基本使用
    6-6漏洞利用-SSH安全防御
    Django的查询所有,根据用户名查询,增加用户操作
    CSS 的继承性和优先级
    【计算机系统(1)】5 LC-3中断实验
    ZooKeeper 客户端API操作
    java.nio.file.FileSystemException:......xx.jar
    A-level 物理实验题目
    《C和指针》笔记31:多维数组的数组名、指向多维数组的指针、作为函数参数的多维数组
    创建型设计模式 原型模式 建造者模式 创建者模式对比
  • 原文地址:https://blog.csdn.net/rej177/article/details/126244108