当前位置: 首页 > article >正文

Java笔记——多态

在面向对象编程中多态Polymorphism是三大核心特性之一与封装、继承并驾齐驱。它赋予了程序在运行时动态选择行为的能力让代码更加灵活、可扩展。可以说多态是Java面向对象设计的灵魂。本文将全面剖析Java多态的概念、实现机制、底层原理及最佳实践。一、什么是多态多态的字面意思是“多种形态”。在Java中多态指的是同一个行为具有多个不同表现形式或实现的能力。具体来说就是同一个引用类型调用同一个方法根据实际指向的对象不同执行的结果也不同。简单理解父类引用指向子类对象调用重写方法实际执行的是子类的方法。1.1 多态的前提条件Java实现多态需要满足三个条件继承或实现存在类之间的继承关系或接口的实现关系。方法重写子类重写父类的方法或实现接口的方法。父类引用指向子类对象通过父类类型的引用变量来引用子类对象。二、Java中多态的两种主要形式2.1 继承多态基于继承的运行时多态通过继承和重写实现的多态是最常见的多态形式。// 父类 public class Animal { public void sound() { System.out.println(动物发出声音); } } // 子类 public class Dog extends Animal { Override public void sound() { System.out.println(汪汪汪); } } public class Cat extends Animal { Override public void sound() { System.out.println(喵喵喵); } } // 测试多态 public class Test { public static void main(String[] args) { Animal animal1 new Dog(); // 父类引用指向子类对象 Animal animal2 new Cat(); animal1.sound(); // 输出汪汪汪 animal2.sound(); // 输出喵喵喵 } }2.2 接口多态基于接口的运行时多态接口的多态更加灵活它不依赖于继承关系而是通过实现接口来展现不同的行为。// 定义接口 public interface Payment { void pay(double amount); } // 实现类1支付宝支付 public class AliPay implements Payment { Override public void pay(double amount) { System.out.println(使用支付宝支付 amount 元); } } // 实现类2微信支付 public class WeChatPay implements Payment { Override public void pay(double amount) { System.out.println(使用微信支付 amount 元); } } // 测试多态 public class PaymentTest { public static void main(String[] args) { Payment payment new AliPay(); // 接口引用指向实现类 payment.pay(100.0); // 输出使用支付宝支付100.0元 payment new WeChatPay(); // 更换实现 payment.pay(200.0); // 输出使用微信支付200.0元 } }三、多态的内部机制动态绑定与静态绑定3.1 动态绑定Dynamic BindingJava中的多态属于运行时多态也就是说方法调用的具体版本是在程序运行时才确定的。这种机制称为动态绑定或后期绑定。动态绑定的过程编译器检查父类中是否有该方法编译时安全检查。在运行时JVM根据对象的实际类型查找并执行对应的子类方法。3.2 静态绑定Static Binding私有方法、静态方法、构造器以及final方法属于静态绑定在编译时就确定了具体调用哪个方法没有多态特性。public class Parent { public static void staticMethod() { System.out.println(Parent static method); } public void instanceMethod() { System.out.println(Parent instance); } } public class Child extends Parent { public static void staticMethod() { System.out.println(Child static method); } Override public void instanceMethod() { System.out.println(Child instance); } } public class Test { public static void main(String[] args) { Parent p new Child(); p.staticMethod(); // 输出Parent static method静态绑定由引用类型决定 p.instanceMethod(); // 输出Child instance动态绑定由实际对象决定 } }四、多态中的成员访问特点4.1 成员变量编译看左边运行看左边多态中成员变量的访问不具多态性无论是读取还是赋值都取决于引用变量的类型编译时类型。class Parent { String name Parent; } class Child extends Parent { String name Child; } public class Test { public static void main(String[] args) { Parent p new Child(); System.out.println(p.name); // 输出Parent } }4.2 成员方法编译看左边运行看右边成员方法具有多态性编译时检查父类是否有该方法运行时执行子类重写的方法。class Parent { void show() { System.out.println(Parent show); } } class Child extends Parent { Override void show() { System.out.println(Child show); } void childOnly() { System.out.println(Child only); } } public class Test { public static void main(String[] args) { Parent p new Child(); p.show(); // 输出Child show // p.childOnly(); // 编译错误父类引用无法调用子类特有方法 } }4.3 静态方法编译看左边运行看左边静态方法属于类不具备多态性由引用类型决定。class Parent { static void staticShow() { System.out.println(Parent static); } } class Child extends Parent { static void staticShow() { System.out.println(Child static); } } public class Test { public static void main(String[] args) { Parent p new Child(); p.staticShow(); // 输出Parent static } }五、多态的优势与意义5.1 可扩展性开闭原则多态是“开闭原则”的基石——对扩展开放对修改关闭。新增功能时无需修改已有代码只需新增子类或实现类。// 假设有一个打印形状的方法 public void printArea(Shape shape) { System.out.println(面积为 shape.getArea()); } // 新增圆形无需修改printArea方法只需新增Circle类实现Shape class Circle implements Shape { Override public double getArea() { ... } }5.2 代码复用与可维护性多态使代码可以面向抽象编程降低耦合度提升可维护性。5.3 替代繁琐的条件分支原本需要大量if-else或switch判断类型的地方可以使用多态优雅替换。// 不优雅的方式 if (type.equals(dog)) { new Dog().sound(); } else if (type.equals(cat)) { new Cat().sound(); } // 多态方式 Animal animal AnimalFactory.getAnimal(type); animal.sound();六、多态的局限与应对6.1 父类引用无法调用子类特有方法当使用父类引用指向子类对象时只能调用父类中声明的方法包括子类重写的方法不能调用子类独有的方法。解决方案使用向下转型强制类型转换。Animal animal new Dog(); if (animal instanceof Dog) { Dog dog (Dog) animal; dog.watchHome(); // 调用子类特有方法 }6.2 向下转型的安全问题向下转型可能引发ClassCastException因此转型前务必使用instanceof进行类型检查。if (animal instanceof Dog) { Dog dog (Dog) animal; }Java 16引入了模式匹配Pattern Matching简化了instanceof后的转型if (animal instanceof Dog dog) { dog.watchHome(); // 直接使用转型后的变量 }七、多态与设计模式多态是许多设计模式的基础常见的如策略模式将算法族封装通过多态动态切换策略。工厂模式通过多态返回不同的产品对象。模板方法模式父类定义骨架子类通过重写实现细节。八、总结多态是Java面向对象编程的核心它让程序能够根据对象的实际类型动态决定行为从而实现代码的灵活、可扩展和易于维护。理解多态的关键在于多态的基础继承或实现、重写、父类引用指向子类对象。动态绑定方法调用在运行时才确定这是Java多态的底层机制。成员访问变量和静态方法看编译类型实例方法看运行类型。转型与instanceof向下转型前务必进行类型检查避免异常。

相关文章:

Java笔记——多态

在面向对象编程中,多态(Polymorphism)是三大核心特性之一,与封装、继承并驾齐驱。它赋予了程序在运行时动态选择行为的能力,让代码更加灵活、可扩展。可以说,多态是Java面向对象设计的灵魂。本文将全面剖析…...

告别平庸配图!用Nunchaku FLUX.1 CustomV3轻松制作社交媒体爆款图片

告别平庸配图!用Nunchaku FLUX.1 CustomV3轻松制作社交媒体爆款图片 你是不是也遇到过这样的烦恼?写好了精彩的社交媒体文案,却找不到一张能与之匹配、足够吸引眼球的配图。网上的图片要么版权不明,要么千篇一律,要么…...

Unity 应用动态化交付新思路:Shiply 插件化解决方案深度解析

Unity 应用动态化交付新思路:Shiply 插件化解决方案深度解析一、Unity 应用更新面临的几个问题使用 Unity 引擎的团队——无论是游戏开发者还是构建 3D 交互应用的团队——普遍会遇到以下困境:场景一:紧急 Bug 修复线上突发崩溃或渲染异常&am…...

3027:【例7.1】保留3位小数

#include<iostream> #include<iomanip> using namespace std; int main(){double a;cin>>a;cout<<fixed<<setprecision(3)<<a;return 0; }...

Kinetis L系列TSI电容触摸传感器库深度解析

1. TSI传感器库技术解析&#xff1a;面向Kinetis L系列MCU的电容式触摸感应实现1.1 库定位与工程适用性分析tsi_sensor是专为恩智浦&#xff08;原飞思卡尔&#xff09;Kinetis L系列微控制器设计的轻量级电容式触摸感应&#xff08;Touch Sensing Interface, TSI&#xff09;驱…...

嵌入式C/C++跨平台可移植性工程实践指南

1. 可移植C/C程序设计工程实践指南在嵌入式系统开发中&#xff0c;可移植性并非附加特性&#xff0c;而是架构设计的底层约束条件。当一个项目需要在ARM Cortex-M系列、RISC-V SoC、x86 Linux工控机甚至裸机环境间迁移时&#xff0c;代码层面的平台耦合度直接决定项目生命周期与…...

Java JUC(一)并发编程实现:锁CAS

JUC Java 并发包 高级并发工具集合&#xff0c;是 Java 高性能并发编程的核心库&#xff0c;包括线程池、锁、原子类和并发集合等&#xff0c;让多线程开发更安全、高效、易维护。核心模块典型类线程池Executor, ExecutorService, ThreadPoolExecutor, ScheduledThreadPoolEx…...

W25Q128 SPI Flash实战指南:从寄存器配置到常用指令全解析

W25Q128 SPI Flash实战指南&#xff1a;从寄存器配置到常用指令全解析 在嵌入式系统开发中&#xff0c;外部存储设备的选择往往决定了产品的数据存储能力和性能表现。W25Q128作为一款128Mbit(16MB)容量的SPI Flash存储器&#xff0c;凭借其高性价比、低功耗和灵活的接口配置&am…...

CLIP ViT-H-14 GPU利用率提升技巧:FP16推理+TensorRT加速实践

CLIP ViT-H-14 GPU利用率提升技巧&#xff1a;FP16推理TensorRT加速实践 1. 项目背景与挑战 CLIP ViT-H-14作为当前最先进的视觉语言模型之一&#xff0c;在图像特征提取领域展现出强大能力。但在实际部署中&#xff0c;我们面临两个主要挑战&#xff1a; 显存占用高&#x…...

Ostrakon-VL-8B赋能餐饮运维:基于视觉的硬件设备故障预判

Ostrakon-VL-8B赋能餐饮运维&#xff1a;基于视觉的硬件设备故障预判 1. 引言 想象一下&#xff0c;一家连锁餐厅的经理&#xff0c;每天最头疼的事情之一&#xff0c;可能就是后厨那台“脾气不定”的制冰机。它可能在最繁忙的午市突然罢工&#xff0c;也可能在深夜悄悄漏水&…...

构建社区照护桥梁:.NET Core3.1+MVC社区呼叫系统设计与实现

在人口老龄化加剧和社区服务需求日益增长的背景下&#xff0c;如何高效连接有照护需求的居民与专业的照护人员&#xff0c;成为社区管理面临的一大挑战。为此&#xff0c;我们设计并开发了一套 社区呼叫系统&#xff0c;旨在通过信息化手段&#xff0c;打造一个集需求发布、派单…...

电池管理(BMS)控制系统 电动客车电池管理系统SOC估算单元设计 设计一款电池管理系统,它包...

电池管理(BMS)控制系统 电动客车电池管理系统SOC估算单元设计设计一款电池管理系统&#xff0c;它包含着以下功能&#xff1a; 1、搭建考虑温度的二阶RC电池Simulink模型&#xff0c;监测并且采集每节电池的电压、采集一部分电池的温度&#xff0c;同时采集动力电池的总压以及电…...

青岑CTF MISC 我不要革命失败 Writeup

题目信息 - 题目名称&#xff1a;我不要革命失败题目类型&#xff1a;MISC题目分值&#xff1a;500题目描述&#xff1a;小吉的机械革命笔记本又双叒叕蓝屏了&#xff01;这次他不想再坐以待毙&#xff01;他发来了他在 C:\Windows\Minidump\ 下的蓝屏文件&#xff0c;请你帮忙…...

探索eviews与Stata在计量经济学中的应用:VAR模型、VECM模型及脉冲响应与方差分解...

eviews stata计量经济学模型&#xff0c;VAR模型&#xff0c;VECM模型&#xff0c;脉冲响应&#xff0c;方差分解。计量经济学里头的VAR模型&#xff0c;简直就是时间序列分析的万金油。这玩意儿全称叫向量自回归模型&#xff0c;说白了就是几个变量互相解释对方。比如研究GDP和…...

高质量就业分析网络安全就业现状:哪些岗位最缺人、薪资多少?

高质量就业分析|网络安全就业现状&#xff1a;哪些岗位最缺人、薪资多少&#xff1f; 打开招聘软件&#xff0c;你会发现一个极为矛盾的现象&#xff1a;一边是未散的传统互联网"裁员潮"&#xff0c;求职竞争白热化&#xff1b;另一边是网络安全岗位持续"求贤若…...

基于位置的阻抗控制,自适应变阻抗控制,平面力跟踪仿真,有结果图,simscape simuli...

基于位置的阻抗控制&#xff0c;自适应变阻抗控制&#xff0c;平面力跟踪仿真&#xff0c;有结果图&#xff0c;simscape simulink matlab&#xff0c;机械臂采用ur5直接上干货。咱今天聊机械臂的力控制&#xff0c;拿UR5当例子&#xff0c;在Simulink里搞基于位置的阻抗控制。…...

无人棋牌室真正的核心,不是“无人”,而是这套系统逻辑

很多人第一次接触无人棋牌室&#xff0c;会把重点放在“无人”这两个字上。但如果从运营角度看&#xff0c;“无人”只是结果&#xff0c;不是本质。真正的核心是&#xff1a;&#x1f449; 有没有一套稳定运行的系统逻辑一、无人只是表象&#xff0c;系统才是本质一个棋牌室能…...

AI教材生成新玩法!利用低查重技巧,让你的教材脱颖而出

梳理教材的知识点真是一项“精细活”&#xff0c;关键在于如何保持平衡与衔接。这项工作让人很挠头&#xff0c;因为总是担心重要的知识点被遗漏&#xff0c;或者无法掌控知识的难度梯度——小学教材可能会写得太复杂&#xff0c;让学生无法理解&#xff1b;而高中教材则可能显…...

all-MiniLM-L6-v2参数详解:384维隐藏层+知识蒸馏技术原理与调用影响

all-MiniLM-L6-v2参数详解&#xff1a;384维隐藏层知识蒸馏技术原理与调用影响 1. 模型核心参数解析 all-MiniLM-L6-v2是一个专门为高效语义表示设计的轻量级句子嵌入模型。理解其核心参数对于正确使用和优化模型性能至关重要。 1.1 架构参数详解 Transformer层数&#xff…...

广告喷印行业:一部不断革新的进化史

广告喷印行业&#xff0c;作为现代商业传播的核心驱动力之一&#xff0c;其发展历程宛如一部波澜壮阔的科技与创意交织的史诗&#xff0c;深刻塑造了我们所生活的视觉信息环境。故事起始于手工绘制广告的年代。彼时&#xff0c;商业宣传高度依赖画师的技艺&#xff0c;他们以木…...

手眼标定后的常见误区:为什么你的手眼矩阵总是不对?

手眼标定后的常见误区&#xff1a;为什么你的手眼矩阵总是不对&#xff1f; 在机器人视觉引导系统中&#xff0c;手眼标定是连接机械臂与视觉传感器的关键桥梁。许多开发者在完成标定后&#xff0c;往往会遇到一个令人困惑的问题&#xff1a;明明标定过程顺利&#xff0c;但实际…...

java导出excel表

1.工作台&#xff1a;今日数据、订单管理、菜品总览、套餐总览、订单信息接口设计&#xff1a;如上类型转换2.Apache POI&#xff1a;处理微软各种文件的开源项目&#xff0c;可以在java程序中对各种文件读写&#xff0c;一般来说POI主要操作excel文件。&#xff08;如交易明细…...

STM32H7 单片机优化实战:DTCMRAM配置与性能提升指南(STM32CubeIDE环境)

1. DTCMRAM基础概念与STM32H7内存架构 在STM32H7系列单片机中&#xff0c;DTCMRAM&#xff08;Data Tightly Coupled Memory&#xff09;是一个特殊的高速内存区域。这块内存最大的特点就是零等待周期访问&#xff0c;这意味着CPU可以直接以最高主频访问这块内存&#xff0c;不…...

【车载以太网C语言性能优化黄金法则】:20年AUTOSAR专家亲授3大内存泄漏陷阱与实时性达标实测数据

第一章&#xff1a;车载以太网C语言性能优化的底层逻辑与AUTOSAR约束全景车载以太网&#xff08;100BASE-T1 / 1000BASE-T1&#xff09;在ADAS与域控制器中承担高带宽、低延迟通信任务&#xff0c;其C语言实现直接受限于MCU资源&#xff08;如ARM Cortex-R5F缓存行大小、DMA通道…...

3个核心价值:SheetJS商业落地合规指南

3个核心价值&#xff1a;SheetJS商业落地合规指南 【免费下载链接】sheetjs &#x1f4d7; SheetJS Spreadsheet Data Toolkit -- New home https://git.sheetjs.com/SheetJS/sheetjs 项目地址: https://gitcode.com/gh_mirrors/sh/sheetjs 价值维度&#xff1a;开源协议…...

Anaconda+D2L环境搭建保姆级教程:从虚拟环境创建到Jupyter配置

AnacondaD2L环境搭建全流程指南&#xff1a;从零开始构建深度学习实验环境 作为一名长期在机器学习领域实践的开发者&#xff0c;我深知环境配置往往是初学者面临的第一个"拦路虎"。特别是当你想快速上手《动手学深度学习》这类优质课程时&#xff0c;一个稳定、隔离…...

横评后发现!全场景通用降AI率平台,千笔·专业降AIGC智能体 VS speedai

在AI技术迅猛发展的今天&#xff0c;学术写作领域正经历着前所未有的变革。越来越多的学生和研究者开始依赖AI工具辅助论文撰写&#xff0c;以提高效率、优化内容结构。然而&#xff0c;随之而来的“AI率超标”问题也日益严峻——无论是知网、维普还是Turnitin等查重系统&#…...

大数据领域的核心技术与应用解析

大数据领域的核心技术与应用解析关键词&#xff1a;大数据、分布式存储、分布式计算、实时处理、数据挖掘、应用场景、技术挑战摘要&#xff1a;本文从“超市每天产生10万条销售数据如何处理”的生活场景切入&#xff0c;用“图书馆管理”“餐厅备菜”等通俗比喻&#xff0c;系…...

【Android12】深入解析蓝牙功能配置:从开关设置到自动连接优化

1. Android12蓝牙功能基础配置 Android12对蓝牙功能进行了多项优化和改进&#xff0c;让开发者能够更灵活地控制蓝牙模块。我们先从最基础的蓝牙开关设置开始讲起。 在Android12中&#xff0c;蓝牙的默认开关状态是通过frameworks/base/packages/SettingsProvider/res/values/d…...

MySQL安全加固十大硬核操作及CDN的隐形守护

作为后端程序员&#xff0c;我们每天与MySQL打交道&#xff0c;深知它承载着企业核心数据——用户信息、交易流水、业务逻辑&#xff0c;一旦被入侵&#xff0c;轻则数据泄露、业务停摆&#xff0c;重则面临合规处罚、品牌崩塌。业内共识&#xff1a;90%的MySQL安全事故&#x…...