java - 多态

多态:它允许不同类型的对象对同一方法进行不同的实现,
具体来说,多态性指的是:通过父类的引用变量,来引用子类的对象,从而实现对不同对象的统一操作。

多态,只适用于方法,不适用于属性
多态实现的条件:

1、继承关系,存在继承关系的类之间才能使用多态性,多态性通常通过一个父类用变量引用子类对象来实现

2、方法重写,子类必须重写(Override)父类的方法,
通过在子类中重新定义和实现父类的方法,可以根据子类的特点行为改变这个方法的行为,如猫和狗吃东西的独特行为。

3、父类引用指向子类对象,使用父类的引用变量来引用子类对象,
这样可以实现,对不同类型的对象的统一操作,而具体调用哪个子类的方法会在运行时多态决定


举个例子:根据,猫 和 狗,叫的动作的不同,而实现的多态,

class Animal { // 父类Animalpublic void sound() {System.out.println("动物发出声音");}
}class Dog extends Animal { // Dog 继承 父类Animal@Overridepublic void sound() {System.out.println("狗发出汪汪声");}
}class Cat extends Animal { // Cat 继承 父类Animal@Overridepublic void sound() {System.out.println("猫发出喵喵声");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Dog(); // 父类引用指向子类对象Animal animal2 = new Cat(); // 父类引用指向子类对象# 下面这两个方法调用,就是,多态性的应用:虚拟方法调用,解释如下:/* 在多态的场景下,调用方法时,编译时,认为方法是左边声明的父类的类型的方法(即被重写的方法)执行时,实际执行的是,子类中重写父类的那个方法简称:编译看左边,运行看右边*/animal1.sound(); // 输出:狗发出汪汪声animal2.sound(); // 输出:猫发出喵喵声}
}

对上述代码的解释
在这个例子中,
Animal类是父类,Dog、Cat类是它的子类,
通过将父类的引用变量分别指向子类对象,实现了多态性,
在运行时,根据引用变量的实际类型来调用相应的子类方法,从而输出不同的声音。


多态的弊端:在多态的场景下,我们创建了子类对象,也加载了子类特有的属性和方法,

但是由于声明为父类的引用,
导致我们没有办法直接调用子类特有的属性和方法


例子

public class AnimalTest {public static void mian(String[] args) {AnimalTest test = new AnimalTest()test.adopt(new Dog);// 如果没有多态的话,像下面这一句代码,我们想弄一个Fish的,// 因为我们这里只有一个 public void adopt(Animal animal){...代码},// 那么,就只能再多声明一个 public void adopt(Fish fish) { ...代码 } 的// 那如果,想再要一个monkey的呢,// 那就得再多声明一个 public void adopt(Monkey monkey) { ...代码 } 的// 多麻烦啊test.adopt(new Fish);}public void adopt(Animal animal){/* 这里声明的是Animal animal,但是,实际上new的是 new Dog因为,上面是 test.adopt(new Dog);而,这里的声明的是Animal animal,所以,实际上是:Animal animal = new Dog*/animal.eat()animal.dump()// 这个里面,你只能调用 Animal类中声明过,且,被子类重写的方法// animal.watchDoor() 和 animal.catchMouse() 在这里是调用不到的}
}class Animal {public void eat()){System.out.println("动物进食")}public void dump()){System.out.println("动物跳")}
}class Dog {public void eat()){System.out.println("狗啃骨头")}public void dump()){System.out.println("狗急跳墙")}public void watchDoor()){ // 这个是 Dog 特有的方法System.out.println("狗看门")}
}class Cat {public void eat()){System.out.println("猫吃鱼")}public void dump()){System.out.println("猫跳")}public void catchMouse()){ // 这个是 Cat 特有的方法System.out.println("猫抓老鼠")}
}

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

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

相关文章

php小数四舍五入、向上取整、向下取整

简单示例 1、round 对浮点数进行四舍五入 $result round(3.456, 2); var_dump($result);// 输出结果为:double(3.46)$result round(3.451, 2); var_dump($result);// 输出结果为:double(3.45) 2、ceil 进一取整:向上取整返回下一个最高的整数 $r…

qq通讯录怎么关闭?QQ好友删除了怎么恢复?

在QQ中,通讯录是我们管理好友和进行聊天的重要工具,但有时候我们可能需要一些隐私保护,不让一些用户通过手机通讯录添加自己。如果您正在思考qq通讯录怎么关闭以及恢复意外删除的好友,本文将为您详细介绍如何关闭QQ通讯录和恢复被…

php实现多进程的几种方式

目录 一:使用pcntl扩展库 二:使用Swoole扩展 三:使用多进程模式PHP-FPM 在PHP中实现多进程主要有以下几种方式: 一:使用pcntl扩展库 pcntl扩展库提供了多线程相关的函数,如pcntl_fork()用于创建子进程…

详解操作系统各章大题汇总(死锁资源分配+银行家+进程的PV操作+实时调度+逻辑地址->物理地址+页面置换算法+磁盘调度算法)

文章目录 第三章:死锁资源分配图例一例二 第三章:银行家算法第四章:进程的同步与互斥做题步骤PV操作的代码小心容易和读者写者混 1.交通问题(类似读者写者)分析代码 2.缓冲区问题(第二个缓冲区是复制缓冲区…

RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试

从零开始做题:逆向 ret2shellcode orw

1.题目信息 BUUCTF在线评测 下载orw时防病毒要关闭 2.题目分析 orw是open、read、write的简写。有时候binary会通过prctl、seccomp进行沙箱保护,并不能getshell。只能通过orw的方式拿到flag。 fdopen(‘./flag’); # 打开flag文件,得到fd…

解决Qt连接不上mysql数据库

问题: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7 下载网盘中的三个文件(网盘链接在文章结尾):qsqlmysql.dll、qsqlmysqld.qll、libmysql.dll找到你安装Qt的目录&#xff…

Android MTE技术详解

1.MTE概念 MTE(内存标记扩展)是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中,类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂,不适用于广泛部署(仅调试使用)。MTE当前…

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi,大家好,我是源于花海。本文主要使用数据标注工具 Labelme 对猫(cat)和狗(dog)这两种训练样本进行标注,使用预训练模型 VGG16 作为卷积基,并在其之上添加了全连接层。基于标注样本…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

单张图像三维重建RealFusion 360◦ Reconstruction of Any Object from a Single Image

Luke Melas-Kyriazi, Iro Laina, Christian Rupprecht, Andrea Vedaldi.RealFusion 360◦ Reconstruction of Any Object from a Single Image。RealFusion: 360 Reconstruction of Any Object from a Single Image Abstract We consider th…

升降机SEW MOVIDRIVE变频器设置

SEW变频器Startup 安装好MOVITOOL软件 打开项目开始配置通信连接 以太网连接为例 在此栏输入需要连接的SEW变频器的IP地址,例如:172.25.20.120 设置完成单击“OK” 当设置完成后,请一路OK回到软件管理画面 通信配置正确的软件界面状态 单击红色刷新图标 一切准备就绪后…

DjangoURL调度器(一)

一、介绍 当一个用户请求 Django 站点的一个页面,下面是 Django 系统决定执行哪个 Python 代码使用的算法: Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值,但是如果传入 HttpRequest 对象具有一个ur…

Pytest 识别case规则

一、Python测试框架,主要特点有以下几点: 简单灵活,容易上手;支持参数化;能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytestrequests…

C#简单使用Yolov5的Onnx格式模型进行目标检测

背景 最近要离职了,同事需要了解一下C#如何使用yolov5系列onnx格式模型进行目标检测,由于其对C#不熟练,可能会影响公司后续的开发进度,所以趁着还在,赶紧把手尾搞好。 方案 1、创建一个C# DotNet 8 控制台项目[可千…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台,被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡,以实现数据采集和分析。 系统主要…

EtherCAT主站SOEM -- 18 --Qt-Soem通过CSV模式(周期同步速度模式)控制一个电机转圈圈

EtherCAT主站SOEM -- 18 --Qt-Soem通过CSV模式(周期同步速度模式)控制一个电机转圈圈 0 QT-SOEM视频预览及源代码下载:0.1 QT-SOEM视频预览0.2 QT-SOEM源代码下载1 程序文件修改替换1.1 allvalue.h1.2 motrorcontrol.h1.3 mainwindow.cpp1.4 motrorcontrol.cpp2 ui界面显示该…

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组: — CAN1 和…

Go语言的100个错误使用场景(一)|代码和项目组织

前言 大家好,这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍,我初步浏览之后,大为惊喜。就像这书中第一章的标题说到的:“Go: Simple to learn but hard to master”,整本书通过分析100…