当前位置: 首页 > news >正文

面向对象的三大特征之一多态

多态

概念

  • 多态是同一个对象,在不同时刻表现出来不同的形态,称之为多态。

    • 例如:水,我们把水理解成为一个对象,而水会有不同的形态,比如 液态水、冰块、水蒸气
  • 多态的前提

    • 有继承/实现关系(继承是类和类之间的关系,实现是类和接口直接的关系)
    • 有方法重写(继承之后,要对方法进行重写)
    • 有父类的引用指向子类的对象。例如:Animal a = new Cat();
  • 多态成员的访问特点(非常重要,一定得理解,请先看口诀,再结合图片下方注意文字,和图片理解)

    • 口诀(父类是左边,子类是右边):

      • 对于成员变量,编译看左边,执行看左边
      • 对于成员方法,编译看左边,执行看右边

      注意:

      ​ ①:先解释下口诀,编译看左边,也就是看左边有无这个成员,有的话编译才通过,我们可以看到图片一和图片二两张都是因为左边父类中无 爆红的这个成员,所以报错

      ​ ②:对于成员变量,编译看左边(也就是看左边父类中有无这个成员,有的话编译通过),执行看左边(我们看第三张图,可以看到最中运行的结果是左边父类中的成员变量值)

      ​ ③:对于成员方法,编译看左边(也就是看左边父类中有无这个成员,有的话编译通过),执行看右边(我们看第三张图,可以看到最中运行的结果是右边子类中的成员方法,因为方法重写了)

多态的好处和弊端

  • 好处:提高了程序的扩展性,定义方法的时候,使用父类作为参数,将来在使用的时候使用具体的子类参与操作

  • 弊端:不能使用子类特有的功能(必须父类中有【回想口诀,只有编译通过才行】)

多态的转型

  • 多态的弊端是,不能使用子类特有的功能,怎么办呢?就提出我们多态的转型。

    类型方向
    向上转型从子到父父类引用指向子类对象Animal a = new Cat();
    向下转型从父到子父类引用转为子类对象Cat b = (Cat)a

    注意:向下转型,有个前提,得是同一种对象

    ​ Animal a = new Cat(); // a 是Animal类型,但是本质是 猫

    ​ Dog d = (Dog)a; // 很明显这行就错了,(Dog)a 相当于强转,但是 猫怎么能转成狗呢!

    // 动物类
    class Animal{public void show(){System.out.println("动物!");}
    }
    // 狗类
    class Dog extends Animal{public void show(){System.out.println("狗!");}public void speak(){System.out.println("汪汪");}
    }
    // 猫类
    class Cat extends Animal{public void show(){System.out.println("猫!");}public void eat(){System.out.println("小鱼干");}
    }public class Test {public static void main(String[] args) {// 向上转型Animal a = new Cat();Animal b = new Dog();// 调用方法(父类对象调用,多态的形式,记得口诀)a.show();b.show();// 编译不通过,因此爆红
    /*        a.speak();a.eat();*/// 向下转型Cat c = (Cat)a;Dog d = (Dog)b;// 调用方法(子类对象调用)c.eat();c.show();d.speak();d.show();/*        Cat c1 = (Cat)b;c1.speak();*/}
    }
    

  • 多态很重要,一定要理解!!!

  • 其他两大特征可参考下面这两篇文章:

    • 面向对象的三大特征之一继承

    • 面向对象的三大特征之一封装

http://www.lryc.cn/news/273731.html

相关文章:

  • vue3中标签form插件
  • 企业数字化转型:1个核心、2种力量、3个关键点、4大转型、5大平台
  • Agilent安捷伦E4990A阻抗分析仪20Hz
  • 性能优化-OpenMP概述(一)-宏观全面理解OpenMP
  • Prometheus实战篇:Prometheus监控nginx
  • JVM加载class文件的原理机制
  • 如何使用CapSolver解决Web爬虫中遇到的CAPTCHA问题
  • 杰发科技AC7801——IO模拟IIC注意事项
  • 展台搭建与设计都有哪些思路
  • 解决mock单元测试中 无法获取实体类xxx对应的表名
  • arm64虚拟化技术与kvm实现原理分享
  • 选择 省市区 组件数据 基于vue3 + elment-plus
  • 了解 nextTick
  • C++精进之路(十六)string类和标准模板库
  • 【23.12.29期--Redis缓存篇】谈一谈Redis的集群模式
  • 【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串
  • 欧科云链研究院:奔赴2024,Web3与AI共振引爆数字时代潘多拉魔盒
  • 【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【数学】2023C-素数之积【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • uniapp路由
  • 湖南大学-数据库系统-2023期末考试【原题】
  • 【Java EE初阶九】多线程案例(线程池)
  • 理解 Node.js 中的事件循环
  • Mac 软件出现「意外退出」及「打不开」解决方法
  • 随机森林 3(代码)
  • 勒索事件急剧增长,亚信安全发布《勒索家族和勒索事件监控报告》
  • LeetCode1523. Count Odd Numbers in an Interval Range
  • E中国铜金属行业需求前景及未来发展机遇分析报告2024-2030年
  • python SVM 保存和加载模型参数
  • JAVA进化史: JDK12特性及说明
  • Databend 的算力可扩展性