【多态】(超级详细!)

news/2024/7/25 2:55:19/文章来源:https://blog.csdn.net/2401_82641862/article/details/139264111

【多态】(超级详细!)

  • 前言
  • 一、 多态的概念
  • 二、重写
    • 1. 方法重写的规则
    • 2. 重写和重载的区别
  • 三、多态实现的条件
  • 四、 向上转型
  • 五、动态绑定

前言

面向对象的三大特征:封装性、继承性、多态性。
extends继承或者implements实现,是多态性的前提。
这篇文章中的多态都由继承实现。

一、 多态的概念

简单来说,多态可以理解为当不同的对象去完成时会产生不同的状态
例如:在买火车票这个案例,对于普通人是全价,对于学生是半价,对于军人则是优先购买。
即:同一件事发生在不同对象身上会产生不同的结果

下面以小猫和小狗为例,帮助大家更好的理解多态。

动物食物
小猫猫粮
小狗狗粮

在这里插入图片描述

二、重写

1. 方法重写的规则

重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, **返回值和形参都不能改变。即外壳不变,核心重写!**重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

【方法重写的规则】

  • 子类在重写父类的方法时,一般必须与父类方法原型一致: **返回值类型 方法名 (参数列表)**要完全一致。
  • 被重写的方法返回值类型可以不同,但是必须是具有父子关系的。
    在这里插入图片描述
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected。
  • 父类被static、private修饰的方法、构造方法都不能被重写。
  • 重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心
    将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法
    构成重写。
    在这里插入图片描述

2. 重写和重载的区别

重写重载
参数个数必须相同参数个数必须不同
返回类型相同或存在父子关系返回类型可以不同
访问权限不能比父类中被重写的方法的访问权限更低访问权限可以 修改

方法重载是一个类的多态性表现,而方法重写是父类和子类的一种多态性表现。

三、多态实现的条件

  • 必须是继承关系
  • 涉及到子类对父类方法的重写
  • 通过父类的引用调用父类的方法

同样使用上述小猫和小狗吃东西的例子

1.在这里插入图片描述由上述可知:Animal是父类,Cat和Dog是子类。存在继承关系。
2.在这里插入图片描述
由上述可知:Cat、Dog类中将父类Animal中的eat()方法进行了重写。
3. 在这里插入图片描述
上述两种主方法都实现了父类的引用。

到这里有两个疑问:

  • 什么是向上转型?
  • 为什么上述父类的引用调用的是子类中的eat方法?

下面将为大家一 一解答!

四、 向上转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
语法格式:父类类型 对象名 = new 子类类型()
在这里插入图片描述

【使用场景】

  • 直接赋值
    在这里插入图片描述
  • 方法传参
    在这里插入图片描述
    方法返回
    在这里插入图片描述

注意:向上转型不能调用子类特有的方法!

五、动态绑定

在这里插入图片描述

  • 程序在编译的时候,确实调用的是父类的eat方法。

  • 当运行代码的时候,通过父类的引用,调用了父类和子类重写的那个方法,结果实际调用了子类的方法,此时我们把这种情况叫做动态绑定

通过对动态绑定的学习,我们也对多态有了新的认识:
通过调用同一个方法,表现出的现象不一样,这种思想叫做多态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1053415.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue状态管理深度剖析:Vuex vs Pinia —— 从原理到实践的全面对比

🔥 个人主页:空白诗 文章目录 👋 引言📌 Vuex 基础知识核心构成要素示例代码 📌 Pinia 基础知识核心构成要素示例代码 📌 Vuex与Pinia的区别📌 使用示例与对比📌 总结 👋…

60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置

UE的Environment Query System(EQS)是环境查询系统,它是UE4和UE5中用于AI决策制定过程中的数据采集和处理的一个强大工具。EQS可以收集场景中相关的数据,利用生成器(Generator)针对用户的测试(T…

Spring6基础笔记

Spring6 Log4j2 1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发…

列表、元组、字典和集合的区别

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前面介绍了序列中的列表、元组、字典和集合的应用,下面通过表2对这几个数据序列进行比较。 表2 列表、元组、字典和集合的区别 数 据…

985上交应届生转正12天,被某东辞退了!

👇我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299,限时特价2杯咖啡,满100人涨10元。 01.事情起源 最近粉丝群都在转发一个截图,某应届毕业生在某东实习一年,才转正才12天,就因为自己调侃…

关于c++的通过cin.get()维持黑框的思考

1.前言 由于本科没有学过c语言,研究生阶段接触c上手有点困难,今天遇到关于通过cin.get()来让黑框维持的原因。 2.思考 cin.get()维持黑框不消失的原因一言蔽之就是等待输入。等待键盘的输入内容并回车(一般是回车)后cin.get()才…

ssm球场计费管理系统-计算机毕业设计源码77275

摘 要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在球馆计费管理的要求下,开发一款整体式结构的球场计费管理…

部署Prometheus + Grafana实现监控数据指标

1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…

BIO/NIO学习

在传送文件的时候常常出现这么一个问题,就是当客户端的文件全部传送完了之后,服务器没有接收到客户端那边传过的停止信号,所以服务器也就跟着客户端停止运行了,我们可以使用 try {socket.shutdownOutput();} catch (IOException e…

2024 年科技裁员综合清单

推荐阅读: 独立国家的共同财富 美国千禧一代的收入低于父辈 创造大量就业机会却毁掉了财富 这四件事是创造国家财富的关键 全球财富报告证实联盟自始至终无能 美国人已陷入无休止债务循环中,这正在耗尽他们的财务生命 2024 年,科技行业…

鸿蒙OS开发:典型页面场景【一次开发,多端部署】(信息应用)案例

信息应用 简介 内容介绍 Mms应用是OpenHarmony中预置的系统应用,主要的功能包含信息查看、发送短信、接收短信、短信送达报告、删除短信等功能。 架构图 目录 /Mms/ ├── doc # 资料 ├── entry │ └── src │…

解决vue版本不一致导致不能正常编译

解决vue版本不一致导致不能正常编译 异常现象分析原因解决方案 异常现象 项目原本运行无异常,但安装了一个el-table-infinite-scroll的插件后,编译报错,截图如下 分析原因 vue版本与compile版本不一致,应该统一起来&#xff0…

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题

Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段,后端创建对应的实体类的时间属性需要设定格式(默认的格式不方便阅读),再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…

【Python】 Python中__slots__的妙用:提升性能与内存管理

基本原理 在Python中,每个类默认都会继承自object类,而object类在Python中是一个动态类,允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活,但同时也带来了一些性能和内存使用上的开销。 为了解决这个…

Matlab读取Swarm球谐系数,并绘制EWH全球格网图(存在疑问)

ICGEM官网下载 COST-G发布的4040的球谐系数 close all; clearvars -except; % addpath(E:\Code\Tool\Function\GRACE_functions); dir_degree_1 E:\Code\GRACE_data\Degree_1\deg1_coef.txt; dir_c20 E:\Code\GRACE_data\Degree_2\C20_RL06.txt; myDir_Swarm E:…

pyinstaller打包提示“文件所在的卷已被外部更改,因此打开的文件不再有效。”

环境 anaconda : 24.1.2python : 3.7.13pyinstaller : 5.13.0 问题描述 之前使用pyintaller执行spec文件打包都是能成功,今天打包报了“文件所在的卷已被外部更改,因此打开的文件不再有效。”的错误 Traceback (most recent call last):File "C…

广场舞团|基于SprinBoot+vue的广场舞团系统(源码+数据库+文档)

广场舞团系统 目录 基于SprinBootvue的广场舞团系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 后台登录模块 5.2.1管理员功能模块 5.2.2社团功能模块 5.2.3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

【Python编程实战】基于Python语言实现学生信息管理系统

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端? 在SpringCloud的Config配置中心中分了Server服务端和Client客户端,为什么需要这样分呢?它的思想是所有微服务的配置文件都放到git远程服务器上,让…

01 一文理解,Prometheus详细介绍

01 一文理解,Prometheus详细介绍 介绍 大家好,我是秋意零。 Prometheus 是一个开源的系统监控和报警工具包,最初由SoundCloud开发,并在2012年作为开源项目发布。Prometheus 目前由Cloud Native Computing Foundation&#xff08…