Java,面向对象,多态性

news2024/11/19 21:28:05

        多态性是面向对象的第三大重要特征,建立在继承性之上。

        多态性一词怎么理解呢?就是一个事物的多种形态的性质。在面向对象中,主要体现为一个父类的属性方法可以继承给多个子类。子类就理解为父类的多种形态。以动物为例,猫和狗都有动物的特征,动物即“父类”,猫和狗就是动物的多个“子类”。

        那么多态性有什么用处呢?在代码中,一个子类的对象,引用却是用父类的引用类型,就是多态性。例:

        若已创建了Animal类,Dog类和Cat类继承于Animal类。

        

Animal a1 = new Dog();

        这里引用数据类型为Animal类,创建的对象是Dog类。

        若此时要调用a1的方法,是怎么运行的呢?

         若将光标放到a1调用的jump方法上,显示的是Animal的方法。 

        再看Animal和Dog中的jump方法。

        

        

         可以发现,Dog中的jump方法是经过重写的,这时将代码运行:

        

        能发现,虽然编译器指明a1调用的方法是Animal类的jump方法,但是实际运行却是运行的Dog类中的重写后的jump。

        在多态的场景下,调用方法时。编译时,认为方法是父类的方法。实际运行时,执行的是子类中的重写方法。(前提:调用的方法的前提是此方法是子类重写了父类的方法的情况下,才满足以上多态性。)

        多态性的使用前提:1.要有类的继承关系。2.要有方法的重写。

        多态性的适用范围:适用于重写的方法,不适用于属性。

        但是,如此也看不出多态性有什么用处。多态性一般也不会直接用父类的引用来创建对象,那并不能体现多态性的优点。具体多态性的使用如下,还是以Animal和Dog和Cat举例。

         

         在adopt的参数列表中,参数animal的引用类型为Animal。在main方法中,创建Dog和Cat的对象dd和cc,再将dd和cc作为参数调用adopt方法。

         一个adopt的方法,可以同时供Cat类和Dog类的对象使用,因为参数的引用数据类型声明为Animal,而Cat和Dog是Animal的子类。

        如此可以看出,多态性的优点是,可以极大减少代码的冗余,不需要定义多个重载的方法,一个方法可以供多个子类使用。

        那么如果想要在adopt中调用Cat和Dog中的特有的方法,该如何做呢?

        这时候便要涉及到向下转型。

        向下转型即将父类的引用转化为子类的引用。需要使用强转符()。比如,Dog dog = (Dog)animal 。注:这种转换dog和animal的地址相同,指向内存中同一个对象的存储,只是二者的引用数据类型不同。

        还涉及到了一个关键字:instanceof,格式:a instance A 。instanceof是用来判断对象a是否是A类型或者A的子类类型的实例。如果是返回true,不是则返回false。

        如此,便可以用instanceof来判断传入的参数animal是哪个类的实例,再将animal的引用数据类型向下转型为相应的Animal的子类的引用数据类型之后,就可以调用相应的子类的特有的方法了。

        例:

        

        

        

 输出结果为:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOAP协议是什么协议,有什么作用

SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在网络上进行信息交换。它是一种轻量的协议,旨在进行分布式计算环境中的通信。SOAP可以通过各种下层协议来传输,但最常用的是HTTP。 主要作用&#xff1…

桂林阳朔旅游攻略

桂林上水甲天下,阳朔上水甲桂林!阳朔县城看着有点破,但是阳朔的山水真是一绝,适合慢下来,骑个电瓶车来放松心情! 适合游玩时间3天左右。 主要景点:十里画廊、兴坪古镇、如易峰、相公山、20元人民币打卡处…

uniapp开发号卡系统

我们先来看一下效果图 商品分享、店铺分享等功能 部分代码 <template><view class""><view class"uy-bg-ffffff uy-p-20 uy-m-t-20 uy-b-r-20 uy-rel" v-for"(item,index) in list" :key"index"><view class&q…

cocosCreator 之 微信小游戏授权设置和调用wxAPI获取用户信息

版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 官方文档&#xff1a; 微信官方文档 - 开放能力 微信 API 小游戏环境 在cocosCreator的3.x版本项目开发中&#xff0c;TypeScript最终会被转换为JavaScript语言。 JavaScript的运行时调用的API…

APISpace 全国快递物流地图轨迹查询API接口案例代码

1.全国快递物流地图轨迹查询接口详解 1.1 接口请求 请求方式&#xff1a;POST请求地址&#xff1a;https://eolink.o.apispace.com/wldtgj1/paidtobuy_api/trace_map请求头&#xff1a; 标签必填说明X-APISpace-Token是鉴权私钥&#xff0c;登陆 APISpace 后在管理后台的[访…

竞赛 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

高效文件批量重命名:轻松解决文件名中文翻译英文的问题

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;其中有些文件可能包含中文字符或词汇。当我们需要将这些文件名翻译为英文时&#xff0c;手动修改每个文件名会非常耗时且容易出错。为了解决这个问题&#xff0c;我们可以使用云炫文件管理器高效批量重命…

【Linux】Linux环境配置以及部署项目后端

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Linux环境配置 1.JDK ①上传安装包到服…

BUUCTF 小明的保险箱 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 小明有一个保险箱&#xff0c;里面珍藏了小明的日记本&#xff0c;他记录了什么秘密呢&#xff1f;。。。告诉你&#xff0c;其实保险箱的密码四位纯数字密码。 密文&#xff1a; 下载附件&#xff0c;得到一张.jpg…

普通unity项目升级URP管线渲染项目教程

普通unity项目升级URP管线渲染 安装URP插件创建URP渲染管线配置渲染管线升级素材的渲染管线方式一方式二 资源链接 安装URP插件 点击Window选择Package Manager在出现的窗口左上角选择Unity Registry搜索关键字Universal在出现的Universal RP插件中下面点击Install 创建URP渲染…

word自带公式,多个公式的左对齐

利用wold自带公式对公式进行编辑。 需要用多个公式表示&#xff0c;通常利用矩阵或大括号的形式&#xff0c;它们实现左对齐的方式一样。网络上主要说了两种方式&#xff1a; 1. shiftf7的方式&#xff0c;自己并没有成功实现。 2. 公式全选后单击右键&#xff0c; 原始数据…

UNIPOSE: DETECTING ANY KEYPOINTS(2023.10.12)

文章目录 AbstractIntroduction现有的方法存在哪些不足基于此&#xff0c;我们提出了哒哒哒取得惊人的成绩Related Work MethodMULTI -MODALITY PROMPTS ENCODING&#xff08;多模态提示编码&#xff09;Textual Prompt Encoder&#xff08;文本提示编码器&#xff09;Visual P…

保姆级安装Jdk,Tomact,Mysql在linux中并且部署项目

&#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏都能满足你的需求。我会用最简单易懂的语言&#xff0c;带你走进代码的世界&#xff0c;…

搭建高性能分布式存储-minio

文章目录 搭建高性能分布式存储-minioDocker搭建minio&#xff08;单机部署纠删码模式&#xff09;⭐创建minio的bucket&#xff08;桶&#xff09;⭐SpringBootminio项目实战 ⭐1&#xff1a;导入minio的maven依赖2&#xff1a;编写MinioProperties.class3&#xff1a;applica…

浪潮信息G7服务器智能高效的运维秘籍

数据中心的运维压力到底有多大&#xff1f;过去&#xff0c;IT圈里流传着这样一句话&#xff1a;一入运维深似海&#xff0c;从此下班是路人。随着人工智能、大数据、云计算等技术的成熟应用&#xff0c;数据中心走向集约化、规模化的趋势&#xff0c;数据中心的IT设备越来越繁…

基于platform驱动模型完成LED驱动的编写

添加设备树文件信息 myplatform{compatible"hqyj,myplatform";//厂商信息&#xff0c;用于驱动端进行匹配interrupt-parent<&gpiof>; //关联中断父节点interrupts<9 0>; //和中断父节点的关系描述符led1-gpio<&gpioe 10 0>; led2-gpio<…

Unreal UMG MVVM

Unreal UMG MVVM 文章目录 Unreal UMG MVVM背景M - VM - V扩展点 Editortime Viewmodels 编辑器界面View Bindings 编辑器界面蓝图编译相关 Runtime 创建 ViewModelViewModel 更新 背景 先阅读文档和 quabqi 的 UOD 视频分享&#xff0c;目前网上唯一的资料看眼成熟的巨硬方案…

回溯法(2)--图着色问题和旅行商问题

目录 一、图着色问题 1、算法设计 2、代码 二、旅行商问题 1、概述问题 2、穷举法 3、回溯法 一、图着色问题 1、算法设计 图着色问题&#xff0c;给定图中各个区域的相邻关系&#xff0c;抽象成一个无向图G&#xff08;V,E&#xff09;&#xff0c;给定m种颜色&…

【HarmonyOS】服务卡片 API6 JSUI跳转不同页面并携带参数

【关键字】 服务卡片、卡片跳转不同页面、卡片跳转页面携带参数 【写在前面】 本篇文章主要介绍开发服务卡片时&#xff0c;如何实现卡片点击跳转不同页面&#xff0c;并携带动态参数到js页面。在此篇文章“服务卡片 API6 JSUI跳转不同页面”中说明了如果跳转不同页面&#xf…