Java中关于多态的总结
多态是面向对象编程的三大特性之一(封装、继承、多态),它允许不同类的对象对同一消息做出不同的响应。
多态的基本概念
1、定义
多态(Polymorphism)指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
父类的引用指向子类的对象,只能调用父类的方法和子类重写的父类的方法,不能调用子类独有的方法。
2、多态的必要条件
-
继承关系:存在继承或实现关系
-
方法重写:子类重写父类方法
-
父类引用指向子类对象:向上转型(Upcasting)
3、多态的表现形式
-
编译时多态:方法重载(Overload)
-
运行时多态:方法重写(Override)
多态的实现方式
1、方法重写实现多态
class Animal {public void makeSound() {System.out.println("动物发出声音");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("汪汪汪");}
}public class Test {public static void main(String[] args) {Animal a1 = new Cat(); // 向上转型Animal a2 = new Dog(); // 向上转型a1.makeSound(); // 输出"喵喵喵" - 运行时多态a2.makeSound(); // 输出"汪汪汪" - 运行时多态}
}
2、接口实现多态
interface Shape {void draw();
}class Circle implements Shape {@Overridepublic void draw() {System.out.println("绘制圆形");}
}class Square implements Shape {@Overridepublic void draw() {System.out.println("绘制方形");}
}public class Test {public static void main(String[] args) {Shape s1 = new Circle();Shape s2 = new Square();s1.draw(); // 输出"绘制圆形"s2.draw(); // 输出"绘制方形"}
}
3、抽象类、抽象方法实现多态
abstract class Shape {abstract double area(); // 抽象方法void display() { // 具体方法System.out.println("面积:" + area());}
}class Circle extends Shape {private double radius;Circle(double r) { this.radius = r; }@Overridedouble area() {return Math.PI * radius * radius;}
}// 使用多态
Shape shape = new Circle(5.0);
shape.display(); // 输出"面积:78.53981633974483"
多态中的类型转换
1、向上转型
Animal animal = new Cat(); // 向上转型
自动类型转换
子类转父类
安全,不会抛出异常
2、向下转型
Animal animal = new Cat();if (animal instanceof Cat) {Cat cat = (Cat) animal; // 向下转型cat.catchMouse(); // 调用Cat特有方法
}
强制类型转换
父类转子类
不安全,可能抛出ClassCastException
建议先用instanceof检查
多态的特点
-
可替换性:多态对已存在的代码具有可替换性
-
可扩展性:新增子类不影响多态特性的使用
-
灵活性:在应用中体现了灵活多样的操作
-
简化性:简化了应用代码的编写和修改过程
多态与重载的区别
1、基本定义对比
2、方法签名对比
3、继承关系对比
多态的实例 【理解方法调用】
//创建子对象时一定先创建父对象
Animal a1=new Cat();
Cat cat = new Cat();
//Cat:类名
//cat:变量
//new:关键字
//Cat():构造器
Java当中的数据类型,决定数据在内存中的存储形式
在下面的实例中,一共有4个类:A、B、C、D
//A类
public class A {public String Show(D obj) {return "A and D";}public String Show(A obj) {return "A and A";}
}
//B类
public class B extends A{public String Show(Object obj) {return "B and B";}public String Show(A obj) {return "B and A";}
}
//C类
public class C extends B{
}
//D类
public class D extends B{}
测试类:
public class Test {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println("1---"+a1.Show(b));System.out.println("2---"+a1.Show(c));System.out.println("3---"+a1.Show(d));System.out.println("4----"+a2.Show(b));System.out.println("5----"+a2.Show(c));System.out.println("6----"+a2.Show(d));System.out.println("7---"+b.Show(b));System.out.println("8---"+b.Show(c));System.out.println("9---"+b.Show(d));}
}
结果:
实例解析:
a1.show()内存图(简略版)如下:
a1只能调用A中的两个方法,要么输出A and D,要么输出A and A;
1、a1.show(b)
传入的参数为B类型的b,而B类继承自A类,自动向上转型至A类【此时涉及到多态】;
输出A and A;
2、a1.show(c):
C类的c向上转型2次至A类,输出A and A;
3、a1.show(d):
传入的参数为D类型的d,A类方法本身有show(D obj),不需要向上转型
a2.show()内存图:
a2为A类型,调用B类时,会先生成B类的父类A类,所以在堆中有两个类,但是a2指向A类;
当A类中的方法被子类B类重写时,A类方法失效,原方法指向B类中的新方法;
a2输出的语句要么为A and D,要么为 B and A;
4、a2.show(b)
传入的参数为B类型的b,向上转型为A类,输出B and A;
5、a2.show(c)
传入的参数为C类型的c,向上转型两次为A类,输出B and A
6、a2.show(d)
方法本身有D类型的参数,不需要转型,直接输出A and D;
b.show():
B b=new B()---这种纯子类的方式,不掺杂任何其他类型时,既能利用到父类,也能利用到子类【继承】;
因为子类重写父类show(A)方法,所以A类对应方法失效;
所以b可以调用3种方法;
7、b.show(b)
传入B类型的b,向上转型为A类,输出B and A;
8、b.show(c)
传入C类型的c,向上转型2次为A类,输出B and A;
9、b.show(d)
不需要转型,直接输出 A and D;
相关文章:
Java中关于多态的总结
多态是面向对象编程的三大特性之一(封装、继承、多态),它允许不同类的对象对同一消息做出不同的响应。 多态的基本概念 1、定义 多态(Polymorphism)指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果…...
突破跨界传输瓶颈:Zynq OCM与DDR核间数据共享性能深度调优
一、当硬件加速遇上内存墙:Zynq数据共享的终极挑战 在某军工雷达信号处理项目中,工程师小王遇到了棘手难题——通过Zynq的ARM核与FPGA协同处理雷达回波数据时,系统吞吐量始终无法突破200MB/s的瓶颈。经过三天三夜的排查,发现问题的根源竟是OCM与DDR之间的数据传输效率不足…...
基于 Ubuntu 24.04 部署 WebDAV
无域名,HTTP 1. 简介 WebDAV(Web Distributed Authoring and Versioning)是一种基于 HTTP 的协议,允许用户通过网络直接编辑和管理服务器上的文件。本教程介绍如何在 Ubuntu 24.04 上使用 Apache2 搭建 WebDAV 服务,无…...
JVM、JRE、JDK的区别
JVM JVM全称Java虚拟机(Java Virtual Machine, JVM),它是运行java字节码的虚拟机,JVM针对不同的系统有不同的实现,目的运行相同的字节码有同样的结果,JVM是“一次编译,到处运行”实现的关键。如下不同的编程语言编译生成字节码文…...
解密火星文:LeetCode 269 题详解与 Swift 实现
文章目录 摘要描述题解答案题解代码分析构建图(Graph)拓扑排序(Topological Sort) 示例测试及结果时间复杂度空间复杂度实际场景类比总结 摘要 这篇文章我们来聊聊 LeetCode 269 题:火星词典(Alien Dictio…...
系统思考:短期困境与长期收益
最近在项目中,一直有学员会提到一个议题,如何平衡当前困境和长期收益? 我的思考是在商业和人生的路上,我们常常听到“鱼和熊掌不可兼得”的说法,似乎短期利益和长期目标注定是对立的。但事实上,鱼与熊掌是…...
K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战
引言 在 Kubernetes 环境中,容器镜像的存储与管理至关重要。企业级镜像仓库(如 Harbor)为团队提供了安全、稳定、可扩展的镜像管理解决方案。 一、Harbor 安装与配置 Harbor 是由 VMware 开源的企业级云原生镜像仓库,它不仅支持…...
2025-05-10-FFmepg库裁切有水印的视频
裁后 代码 import subprocess# 文件路径 input_video_path "bg_video.mp4" output_video_path "output_video_cropped.mp4"# 裁剪视频下方的水印 def crop_video(input_video_path, output_video_path, crop_height):# 获取视频的分辨率def get_video…...
通信协议选型篇:如何根据项目需求选择合适的通信协议?
🧭 本文为《嵌入式通信协议全解析》第七篇,面向系统架构师、嵌入式开发者与技术决策者,提供一套实用的通信协议选型方法论,结合性能对比表、使用案例与决策树,助你在“带宽、功耗、距离、可靠性、生态”之间做出最优权衡。 🔍 一、为什么通信协议的选型很关键? 在嵌入…...
Altera系列FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供4套Quartus工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->OV7725摄像头输入Sensor之-->OV5640摄像头输入Sensor之…...
大模型的实践应用39-Qwen3(72B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法等研发数学教学管理与成绩提升系统
大家好,我是微学AI,今天给大家介绍一下大模型的实践应用39-Qwen3(72B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法等研发数学教学管理与成绩提升系统。 在2025年AI技术快速发展的背景下,大模型已展现出在教育领域的巨大潜力。通义千问Qwen3作为阿里云推出的最新一代…...
【强化学习】动态规划(Dynamic Programming, DP)算法
1、动态规划算法解题 LeetCode 931. 下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选…...
【Linux】深入拆解Ext文件系统:从磁盘物理结构到Linux文件管理
目录 1、理解硬件 (1)磁盘 (2)磁盘的物理结构 (3)磁盘的存储结构 (4)磁盘的逻辑结构 (5)CHS && LBA地址 2、引入文件系统 (1&…...
linux ptrace 图文详解(八) gdb跟踪被调试程序的子线程、子进程
目录 一、gdb跟踪被调试程序的fork、pthread_create操作 二、实现原理 三、代码实现 四、总结 (代码:linux 6.3.1,架构:arm64) One look is worth a thousand words. —— Tess Flanders 相关链接: …...
【列表类型】
1、按索引取值 索引可正向存取,也可反向存取 l [111, paipai, cat] # 正向取值 print(l[1]) # 方向取值 print(l[-1]) # 通过索引给列表重新赋值,前提:索引存在 l[0] ccat print(l) # 索引不存在的情况下,取值or重新赋值的情况下都会报错 …...
MySQL 8.0 OCP 英文题库解析(二)
Oracle 为庆祝 MySQL 30 周年,截止到2025.07.31 之前。所有人均可以免费考取 原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题6~15。 试题6: …...
数据分析与逻辑思维:六步解决业务难题;参考书籍《数据分析原理:6步解决业务分析难题 (周文全, 黄怡媛, 马炯雄)》
文章目录 一、懂业务:业务背景与逻辑前提1.1 明确业务目标与问题定义1.2 培养批判性思维与高于业务视角 二、定指标:构建科学的指标体系2.1 指标拆解与维度分析2.2 典型指标体系案例:用户与业务视角 三、选方法:匹配业务需求的分析…...
人力资源管理系统如何有效提高招聘效率?
在传统招聘模式下,企业招聘常常陷入 “泥潭”。HR 每天需要花费大量时间在海量简历中 “大海捞针”,手动筛选、电话沟通、安排面试,流程繁琐且效率低下。好不容易邀约到候选人,却因面试安排冲突、信息传递不及时等问题,…...
FAISS 与机器学习、NLP 的关系
FAISS(Facebook AI Similarity Search)是一个用于高效相似性搜索和密集向量聚类的开源库,由 Facebook AI Research 开发。它在机器学习(特别是自然语言处理,NLP)领域中扮演着重要角色,主要解决大…...
文件包含2
远程文件包含与本地文件包含的区别 对比 对比项本地文件包含(LFI)远程文件包含(RFI)定义攻击者包含服务器本地的文件攻击者包含远程服务器(如HTTP/FTP)上的文件依赖条件不需要特殊配置需要allow_url_incl…...
嵌入式系统架构验证工具:AADL Inspector v1.10 全新升级
软件架构建模与早期验证是嵌入式应用的关键环节。架构分析与设计语言(AADL)是专为应用软件及执行平台架构模型设计的语言,兼具文本与图形化的双重特性。AADL Inspector是一款轻量级的独立工具: 核心处理能力包括 √ 支持处理AA…...
软考高级系统架构设计师备考分享:操作系统核心知识点整理
在备战软考高级系统架构设计师的过程中,操作系统作为核心考点之一,需要系统性地掌握其核心原理。本文将从操作系统分类、进程状态模型、同步互斥机制、死锁问题及存储管理五大模块展开梳理,结合考试高频考点和实际案例进行解析。 一、操作系统…...
22、城堡防御工事——React 19 错误边界与监控
一、魔法护盾:错误边界机制 1. 城墙结界(Error Boundary) // 客户端错误边界use client function useErrorBoundary() {const [error, setError] useState(null);const handleError useCallback((error, errorInfo) > {setError(erro…...
有关SOA和SpringCloud的区别
目录 1. 定义 2. 架构风格 3. 技术栈 4. 服务交互 5. 适用场景 前言 面向服务架构(SOA)是一种软件设计风格,它将应用程序的功能划分为一系列松散耦合的服务。这些服务可以通过标准的通信协议进行交互,通常是HTTP或其他消息传…...
大数据——Mac环境DataSpell集成Jupyter
1、设置 2、添加新的解释器 3、解释器类型选择Conda 4、进入选中全部,然后重启 5、dataspell右下角会显示当前项目的运行环境 6、创建Jupyter Notebook文件 7、测试 8、查看当前配置 (1)本地模式安装使用 (2)…...
解锁健康养生新境界
在追求高品质生活的当下,健康养生早已超越 “治未病” 的传统认知,成为贯穿全生命周期的生活艺术。它如同精密的交响乐,需饮食、运动、心理与生活习惯多维度协奏,方能奏响生命的强音。 饮食养生讲究 “顺时、适性”。遵循二十四节…...
WORD压缩两个免费方法
日常办公和学习中,Word文档常常因为包含大量图片、图表或复杂格式而导致文件体积过大,带来诸多不便,比如 邮件发送受限:许多邮箱附件限制在10-25MB,大文件无法直接发送 存储空间占用:大量文档占用硬盘或云…...
Zabbix监控 RabbitMQ 指定消息队列名称(pull_alarms )的消费者
✅ 1. 编写 RabbitMQ 队列监控脚本 创建脚本文件 /usr/local/bin/zbx_rabbitmq_metric.sh 并写入以下内容: #!/bin/bash # /usr/local/bin/zbx_rabbitmq_metric.shQUEUE$1 METRIC$2 USER$3 PASS$4if [[ -z "$QUEUE" || -z "$METRIC" || -z &q…...
RabbitMQ ②-工作模式
RabbitMQ 工作模式 官方提供了七种工作模式 Simple(简单模式) P:生产者,发布消息到队列C:消费者,从队列中获取消息并消费Queue:消息队列,存储消息。 一个生产者,一个…...
《探索React Native社交应用中WebRTC实现低延迟音视频通话的奥秘》
WebRTC,全称为Web Real-Time Communication,是一项开创性的开源技术,为Web和移动应用开启了实时通信的大门。它打破了传统通信的束缚,使得应用之间无需依赖繁琐的中间服务器,就能实现直接的点对点通信,这是…...
UI设计公司兰亭妙微分享:汽车 MHI 设计的界面布局创新法则
在汽车人机界面(MHI)设计中,界面布局犹如建筑蓝图,奠定了用户与汽车交互体验的基础。合理创新的布局能提升驾驶安全性与便捷性,融合极简美学与高效操作则成为现代汽车 MHI 界面布局设计的核心追求。 驾驶场景中&…...
【递归,搜索与回溯算法篇】专题(一) - 递归
文章目录 面试题 08.06. 汉诺塔问题21. 合并两个有序链表206. 反转链表24. 两两交换链表中的节点50. Pow(x, n) 面试题 08.06. 汉诺塔问题 题目链接: 面试题 08.06. 汉诺塔问题 题目描述: 在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的…...
B站pwn教程笔记-9
前言:可以去一些开源镜像站下载libc老的乌班图镜像,因为堆题的libc可能比较老,没有新的一些保护措施和机制。 格式化字符串漏洞 归根结底,可以读写任意地址内存。 泄露栈数据/任意地址数据 主要问题就是printf不知道自己有没有…...
NVR(网络视频录像机) 和 网络摄像机(IPC,IP Camera)
NVR(网络视频录像机) 和 网络摄像机(IPC,IP Camera) 是网络监控系统的两个核心组件,但功能定位完全不同。以下是它们的核心区别: 1. 功能角色 组件网络摄像机(IPC)NVR&a…...
数智读书笔记系列032《统一星型模型--一种敏捷灵活的数据仓库和分析设计方法》
引言 在当今数字化时代,数据仓库作为企业数据管理的核心基础设施,承担着整合、存储和提供企业数据的关键角色。随着商业环境的快速变化和业务需求的日益复杂,数据仓库的设计方法也在不断演进,以适应新的挑战和要求。 背景与意义 数据仓库领域长期存在着两种主流方法论之…...
互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现
互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现 场景背景 在某互联网大厂的技术面试中,技术总监张总正在面试一位名为郑薪苦的求职者。郑薪苦虽然对技术充满热情,但回答问题时总是带着幽默感,有时甚至让人哭笑不得。 …...
[C#]Task.Run()和Task.Factory.StartNew()对比(腾讯元宝)
Task.Run和Task.Factory.StartNew都是用来创建并启动任务的方法,但它们的内部实现和使用场景有所不同。两者的主要区别:默认调度器、配置选项、异常处理、适用场景。建议用户大多数情况下使用Task.Run,除非需要StartNew的高级配置,…...
Java游戏服务器开发流水账(3)游戏数据的缓存简介
简介 游戏服务器数据缓存是一种在游戏服务器运行过程中,用于临时存储经常访问的数据的技术手段,旨在提高游戏性能、降低数据库负载以及优化玩家体验。游戏开发中数据的缓存可以使用Java自身的内存也可以使用MemCache,Redis,注意M…...
PostgreSQL可见性映射VM
1.可见性映射 清理过程的代价高昂,为了减小清理的开销,在PostgreSQL 8.4版中引入了VM。 VM的基本概念很简单。 每个表都拥有各自的可见性映射,用于保存表文件中每个页面的可见性。 页面的可见性确定了每个页面是否包含死元组。清理过程可以…...
集成电路流片随笔26:tinyriscv的三级流水线细则pc
include "defines.v"// PC寄存器模块 module pc_reg(input wire clk,input wire rst,input wire jump_flag_i, // 跳转标志input wire[InstAddrBus] jump_addr_i, // 跳转地址input wire[Hold_Flag_Bus] hold_flag_i, // 流水线暂停标志input wire…...
如何解决Jmeter中的乱码问题?
在 JMeter 中遇到乱码问题通常是由于字符编码不一致导致的,常见于 HTTP 请求响应、参数化文件读取、报告生成等场景。以下是系统化的解决方案: 1. HTTP 请求响应乱码 原因: 服务器返回的字符编码(如UTF-8、GBK)与 J…...
TextRNN 模型实现微博文本情感分类
在自然语言处理(NLP)领域,文本情感分类是一项极具应用价值的任务。它能帮助企业分析用户反馈、社交媒体舆情监测等。本文将通过一段实际代码,带大家了解如何利用 PyTorch 框架和 TextRNN 模型,完成微博文本的情感分类工…...
支付宝 SEO 优化:提升小程序曝光与流量的完整指南
在拥有庞大用户基数的支付宝平台上,小程序已成为商家触达用户、提供服务的重要渠道。然而,随着平台上小程序数量的快速增长,如何在激烈的竞争中脱颖而出,获得更多的曝光和流量,成为每个开发者和运营者必须面对的关键挑…...
基于WSL用MSVC编译ffmpeg7.1
在windows平台编译FFmpeg,网上的大部分资料都是推荐用msys2mingw进行编译。在win10平台,我们可以采用另一种方式,即wslmsvc 实现window平台的ffmpeg编译。 下面将以vs2022ubuntu22.04 为例,介绍此方法 0、前期准备 安装vs2022 &…...
高并发内存池(二):项目的整体框架以及Thread_Cache的结构设计
目录 前言 一,项目整体框架设计 二,thread cache结构设计 模拟定长内存池的设计思路 采用一定的对齐规则设计 thread cache大致框架 申请内存Allocate方法 1,thread cache 哈希桶的内存对齐规则 2,内存对齐规则代码实现 …...
K8S扩缩容及滚动更新和回滚
目录: 1、滚动更新1、定义Deployment配置2、应用更新 2、版本回滚1. 使用kubectl rollout undo命令 3、更新暂停与恢复1、暂停更新2、更新镜像(例如,使用kubectl set image命令)3、恢复更新 4、弹性扩缩容1、扩容命令2、缩容命令3…...
K8S - GitLab CI 自动化构建镜像入门
一、引言 在现代持续交付(CI/CD)体系中,容器镜像的自动化构建与推送已成为交付链条的重要一环。 GitLab CI/CD 作为 GitLab 平台的原生集成功能,提供了声明式、可扩展的流水线机制,使得开发者可以在代码生命周期内实…...
万兴PDF-PDFelement v11.4.13.3417
万兴PDF专家(Wondershare PDFelement)是一款国产PDF文档全方位解决方案.万兴PDF编辑器软件万兴PDF中文版,专注于PDF的创建,编辑,转换,签名,压缩,合并,比较等功能.万兴PDF专业版PDF编辑软件,以简约风格及强大的功能在国外名声大噪,除了传统功能外,还提供OCR扫描,表格识别,创建笔…...
4.2【LLaMA-Factory实战】金融财报分析系统:从数据到部署的全流程实践
【LLaMA-Factory实战】金融财报分析系统:从数据到部署的全流程实践 一、引言 在金融领域,财报分析是投资决策的核心环节。传统分析方法面临信息提取效率低、风险识别不全面等挑战。本文基于LLaMA-Factory框架,详细介绍如何构建一个专业的金…...
Vue Router 3 使用详解:从零构建嵌套路由页面
Vue Router 是 Vue.js 官方的路由管理器,常用于构建单页面应用(SPA)。本文将手把手带你完成 vue-router3.6.5 的基本配置,并实现一个带有嵌套路由的页面结构。本文适用于 Vue 2.x 项目 一、安装 vue-router3.6.5 npm install vue…...