32面向对象(中级)-多态

发布时间:2026/9/3 8:46:45

32面向对象(中级)-多态
1.多态的基本介绍多态 多种状态同一个方法对于不同的对象会做出不同反应结果就是多态。1 生活版什么是多态①你有一个宠物喂食器喂食器只认识动物父类你往里面放狗猫猪同一个喂食器同一个喂食动作喂狗 → 狗汪汪吃喂猫 → 猫喵喵吃喂猪 → 猪哼哼吃②同样一句 “付款”微信支付会跳微信、支付宝会跳支付宝、银行卡会走银联 —— 动作都是 “付款”但具体实现完全不一样。同一个动作不同对象表现不一样→ 这就叫多态2 翻译成 Java 代码最简单版本父类动物通用class Animal { // 动物都会叫 public void shout() { System.out.println(动物叫); } }子类 1狗class Dog extends Animal { // 狗重新叫汪汪 Override public void shout() { System.out.println(汪汪汪); } }子类 2猫class Cat extends Animal { // 猫重新叫喵喵 Override public void shout() { System.out.println(喵喵喵); } }3重点来了多态写法Animal a new Dog(); a.shout(); Animal a new Cat(); a.shout();这句话人话翻译左边Animal a我声明这是一只动物右边new Dog()但我实际放进去的是狗也就是表面是动物实际是狗运行结果汪汪汪 喵喵喵变量 a 是 Animal 类型但它先执行的是狗的方法后执行的是猫的方法这就是多态2.多态的前提必须同时满足有继承关系extends子类重写父类方法override父类引用指向子类对象Animal a new Dog();3. 多态的核心口诀编译看左边是什么类型运行看右边实际是谁编译时看父类有没有这个方法运行时执行子类的方法//animal编译类型就是Animal运行类型 Dog Animal a new Dog(); //因为运行时 执行到该行时animal运行类型是Dog,所以cry就是Dog的cry a.shout()://小狗汪汪叫左边Animal 编译类型编译看它右边Dog 运行类型运行用它等号左边也叫编译类型右边叫运行类型4.多态的细节1向上转型2向下转型前面不能调用子类的特有成员方法但是就是想调用那怎么办呢egCatanimal 把animal转成了Cat类。第三点解读要求父类的引用必须指向的是当前目标类型的对象animal 原本就是指向 Cat 类型的对象 cat就是再向上转型的时候 Animal animal new Cat();3属性没有重写之说属性的值看编译类型。4instanceof 比较操作符用于判断在需要判断的时候对象的运行类型是否为XX类型 或 XX类型的子类型5.为什么 Java 一定要有多态多态不是凭空设计出来的语法它本质是为了解决软件开发里最头疼的三个痛点代码冗余、耦合太重、扩展困难。我们用最常见的「支付场景」对比一下你立刻就能懂。痛点 1没有多态代码里全是 if-else臃肿又难维护假设你要做一个收银功能支持微信、支付宝、银行卡三种支付方式。 如果不用多态你的代码大概率会写成这样// 没有多态的糟糕写法 public void pay(String payType, double money) { if (wechat.equals(payType)) { WeChatPay weChat new WeChatPay(); weChat.doPay(money); } else if (alipay.equals(payType)) { AliPay ali new AliPay(); ali.doPay(money); } else if (bank.equals(payType)) { BankPay bank new BankPay(); bank.doPay(money); } }这种写法的问题非常明显每新增一种支付方式比如数字人民币你都要跑到这个方法里加一行else if代码越堆越长支付逻辑和调用逻辑强绑在一起改一个支付方式可能影响整个方法。用多态怎么解决—— 用「抽象接口」统一行为多态的思路是先定义一个抽象的 “支付” 能力再让各个支付方式自己去实现这个能力。调用方只认这个抽象能力不认具体的支付类。// 1. 定义抽象的支付接口统一行为标准 interface Payment { void pay(double money); } // 2. 各个支付方式各自实现内部逻辑互不干扰 class WeChatPay implements Payment { Override public void pay(double money) { System.out.println(微信支付 money 元); } } class AliPay implements Payment { Override public void pay(double money) { System.out.println(支付宝支付 money 元); } }这时候调用方的代码会变得极其简洁// 调用方只和接口打交道完全不用管具体是哪种支付 public void checkout(Payment payment, double money) { payment.pay(money); }痛点 2没有多态改一处动全身耦合太重试想如果哪天微信支付的方法名从doPay()改成了executePay()你不仅要改WeChatPay类还要把所有调用doPay()的地方全改一遍。这就叫耦合调用方和具体的实现类绑死了。而多态做的最关键的一件事就是解耦调用方只依赖「抽象的接口 / 父类」不依赖「具体的子类」。就像老板让员工 “做一份报表”他不用管你是用 Excel 做还是用 Python 写只要你能交出报表就行。老板只依赖 “员工会做报表” 这个抽象能力不依赖 “张三用 Excel 做报表” 这个具体实现。对应到代码里上层业务代码只认识Payment接口底层把WeChatPay换成AliPay上层checkout方法一行都不用改。痛点 3没有多态加新功能必改老代码风险极高软件开发里唯一不变的就是变化今天加微信支付明天加支付宝后天加数字人民币。没有多态时每加一个新功能你都要去修改原有的业务代码。改老代码就意味着可能引入新 bug原本好好的功能改完可能就崩了。而多态完美符合软件开发的「开闭原则」对扩展开放对修改关闭。新增支付方式时你只需要新建一个类实现Payment接口就行// 新增数字人民币支付原有代码一行都不用动 class DcPay implements Payment { Override public void pay(double money) { System.out.println(数字人民币支付 money 元); } }原有收银逻辑、调用逻辑完全不用修改自然也就不会引入新 bug。※※6.java的动态绑定机制作用域问题1当调用对象方法的时候该方法会和该对象的内存地址/运行类型绑定2当调用对象属性时没有动态绑定机制哪里声明那里使用0314_韩顺平Java_动态绑定机制_哔哩哔哩_bilibili7.多态的应用1多态数组数组的定义类型为父类类型里面保存的实际元素类型为子类类型//Person 是 Student Teacher 的父类 Person[] persons new Person[5]; persons[0] new Person(jack,20); persons[1] new Student(mike, 18, 100); persons[2] new Student(smith,19,30.1); persons[3] new Teacher(scott3020000); persons[4] new Teacher(king,5025000);2多态参数方法定义的形参类型为父类类型实参类型允许为子类类型0317_韩顺平Java_多态参数_哔哩哔哩_bilibili

相关新闻

Resilience4j + Prometheus + Grafana实现熔断服务可视化监控

Resilience4j + Prometheus + Grafana实现熔断服务可视化监控

2026/9/3 8:46:44

springboot2.5后,Hystrix熔断器被官方弃用,同时用于可视化监控的Hystrix Dashboard仪表盘也被弃用,高版本springboot使用Resilience4j Prometheus Grafana替代Hystrix Dashboard仪表盘,实现服务熔断的可视化监控 一、可视化监控…

AI眼镜接入智能手表运动健康数据:Livis OTA升级全解析

AI眼镜接入智能手表运动健康数据:Livis OTA升级全解析

2026/9/3 8:36:44

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

SN与IMEI重写工具原理与实战:从Fastboot/EDL模式到NV分区操作

SN与IMEI重写工具原理与实战:从Fastboot/EDL模式到NV分区操作

2026/9/3 8:36:44

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

基于SpringBoot的家庭财务管理系统:从设计到部署的完整实战

基于SpringBoot的家庭财务管理系统:从设计到部署的完整实战

2026/9/3 9:46:48

简介:这是一份面向计算机专业本科生的毕业设计级家庭财务管理系统完整交付包,基于SpringBoot框架构建,解决个人或家庭日常收支记录、统计与可视化管理需求,适合作为课程设计、毕设选题及Java全栈开发能力训练项目。压缩包共807个文…

Python实现Markdown/HTML一键粘贴到Word/Excel:PasteMD工具开发全解析

Python实现Markdown/HTML一键粘贴到Word/Excel:PasteMD工具开发全解析

2026/9/3 9:46:48

简介:PasteMD 是一款面向程序员、技术文档撰写者及办公效率追求者的 Python 桌面工具,专为解决 Markdown、网页富文本及 AI 对话内容在 Word/WPS/Excel 中排版失真、粘贴繁琐的痛点而设计。它通过常驻系统托盘一键触发机制,自动识别剪贴板内容…

智能体工程化:从OpenClaw协作到ClickHouse运行数据闭环

智能体工程化:从OpenClaw协作到ClickHouse运行数据闭环

2026/9/3 9:46:48

如果把九月初关于 AI 的几个热点放在一起看,会发现一个相当清晰的信号。OpenClaw 2.0 开始谈协作,AI 应用圈开始认真讨论护城河,ClickHouse 这类数据库也开始在智能体基础设施里被反复提起。表面上看,这三件事互不相干&#xff1a…

基于AdaIN的图像风格迁移:从原理到PyTorch实战

基于AdaIN的图像风格迁移:从原理到PyTorch实战

2026/9/3 9:46:48

简介:本资源是一套基于AdaIN(Adaptive Instance Normalization)实现图像风格迁移的完整机器学习实践项目,面向人工智能与计算机视觉方向的学习者、研究者及深度学习初学者,旨在解决内容图像与风格图像融合生成高质量艺…

深度学习红外与可见光图像融合:PyTorch训练与MATLAB部署实战

深度学习红外与可见光图像融合:PyTorch训练与MATLAB部署实战

2026/9/3 9:46:47

简介:本资源是一个基于MATLAB实现的红外与可见光图像融合深度学习项目,面向人工智能、计算机视觉方向的初学者与进阶研究者,解决多模态图像信息互补融合这一典型任务。压缩包共62个文件,含46张PNG/JPG格式的配对红外(I…

AgentScope 2.0:快速搭建权限可控、沙箱隔离并可扩展多智能体的智能体框架实战指南

AgentScope 2.0:快速搭建权限可控、沙箱隔离并可扩展多智能体的智能体框架实战指南

2026/9/3 9:36:47

AgentScope 2.0:快速搭建权限可控、沙箱隔离并可扩展多智能体的智能体框架实战指南 【免费下载链接】agentscope Build and run agents you can see, understand and trust. 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope AgentScope 2.0 是…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

远程协作的工作台整理

远程协作的工作台整理

2026/9/3 6:56:24

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/3 6:39:45

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/3 5:20:28

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…