【Java多态】:灵活编程的核心

在这里插入图片描述

🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:【Java】内容概括

在这里插入图片描述
在这里插入图片描述
【前言】

在Java面向对象编程的世界中,多(Polymorphism) 是一个核心概念,它赋予了程序强大的灵活性和扩展性。无论是编写大型企业级应用,还是开发小型工具,多态的合理运用都能让代码更加简洁、优雅且易于维护。本文将深入探讨Java多态的概念、实现方式,并通过丰富的代码示例、图片和表格,带您全面掌握这一重要特性。

文章目录:

  • 一、什么是多态?
    • 1.多态实现条件
    • 2.代码示例
  • 二、重写
    • 1.什么是重写
    • 2.重写与重载的区别
  • 三、向上转型和向下转型
    • 1.向上转型
    • 2.向下转型
  • 四、 多态的优缺点
    • 1.优点
    • 2.缺点
  • 五、总结

一、什么是多态?

多态 字面意思就是多种状态,在Java中,多态就是指不同类型的对象去完成某种行为时的不同状态

在这里举一个例子:我的家里同时养了一只猫和一只狗两个对象),吃饭同一行为)时,猫吃的是一条鱼,狗吃的是一根骨头两种状态

1.多态实现条件

  • 必须在继承体系下
  • 子类要对父类方法进行重写
  • 通过父类的引用调用父类重写的方法

2.代码示例

还是举上面那个例子:猫和狗吃饭,一个吃的是鱼,一个吃的是骨头
父类

public class Animal {public void eat(){System.out.println("吃饭");}
}

Dog子类

public class Dog extends Animal{@Overridepublic void eat(){System.out.println("啃骨头");}
}

Cat子类

public class Cat extends Animal {@Overridepublic void eat(){System.out.println("吃一条鱼");}
}
public class Test {public static void main(String[] args) {Animal animal = new Dog();Animal animal1 = new Cat();animal.eat();animal1.eat();}
}

执行结果:
在这里插入图片描述

在这个程序中,Animal 是父类,DogCat是两个子类,这就确定了它的继承关系,然后子类也对父类的eat方法进行了重写,在运行时,通过父类的引用调用了重写的方法,而执行不同的状态,这就是多态

二、重写

1.什么是重写

重写(override):也称为覆盖。重写是⼦类对⽗类⾮静态⾮private修饰⾮final修饰⾮构造⽅法等的实现过程进⾏重新编写,返回值和形参都不能改变。即外壳不变,核⼼重写!重写的好处在于⼦类可以根据需要,定义特定于⾃⼰的⾏为。 也就是说⼦类能够根据需要实现⽗类的⽅法。

【重写的规则】

  • 子类与父类的返回值类型,方法名(参数列表)要一致;
  • 被重写的方法返回值类型可以不同,但是必须具有父子关系;
  • 父类被static,private 修饰的方法,构造方法都不能被重写;
  • 重写的方法可以用@Override注解来显示指定,它可以帮我们进行校验(如果你的方法名写错,就会报错)

2.重写与重载的区别

  • ⽅法重载⼀个类的多态性表现
  • ⽅法重写⼦类与⽗类的⼀种多态性表现。
区别重写重载
参数列表不能修改必须修改
返回类型不能修改(除非是父子关系)可以修改
访问限定符不能做更严格的限制可以修改
  • 静态绑定:也称为前期绑定(早绑定),即在编译时,根据⽤⼾所传递实参类型就确定了具体调⽤那个⽅法。典型代表函数重载。
  • 动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定⽅法的⾏为,需要等到程序运⾏时,才能 够确定具体调⽤那个类的⽅法。

三、向上转型和向下转型

向上转型向下转型是面向对象编程中关于对象类型转换的两个重要概念,主要应用于继承关系中。它们分别描述了将对象从子类类型转换为父类类型,以及从父类类型转换回子类类型的过程。

1.向上转型

向上转型是指将子类对象赋值给父类引用变量的过程。这种转换是隐式的,不需要显式地进行类型转换,因为子类继承了父类的所有属性和方法,因此子类对象可以被视为父类对象。
语法格式:父类类型 对象名=new 子类类型()

Animal animal = new Dog("旺财"10)

我们还是举上面那个例子

public class Test {public static void main(String[] args) {Animal animal = new Cat();//子类对象赋值给父类对象animal.eat();Animal animal1 = new Dog();//子类对象赋值给父类对象animal1.eat();}
}

我们将子类Dog和Cat类赋值给父类Animal中的引用变量animal,这就是向上转型。通过animal引用变量可以调用eat()方法,而在运行时,实际执行的是子类Dog和Cat中重写的eat()方法

2.向下转型

向下转型是指将父类对象转换为子类类型的操作。这种转换是显式的,需要使用类型转换操作符。向下转型是不安全的,因为父类对象可能并不是子类的实例,因此在向下转型时需要进行类型检查,以避免 ClassCastException 异常。
代码示例:

public class Test {public static void main1(String[] args) {Animal animal = new Cat();//子类对象赋值给父类对象animal.eat();Animal animal1 = new Dog();//子类对象赋值给父类对象animal1.eat();if(animal instanceof Cat){//animal是否引用了Cat类型的对象Cat cat = (Cat) animal;//向下转型cat.eat();}else {System.out.println("animal not instanceof Cat");}}
}

animal 对象被向下转型为Cat类,因为animal实际指向的Cat,所以将他还原为Cat类是可以的,即向下转型。如果强制还原为Dog,就会出现下面的报错,因为animal1指向的Dog

在这里插入图片描述

所以说向下转型是不安全的,万⼀转换失败,运⾏时就会抛异常。Java中为了提⾼向下转型的安全性,引⼊了 instanceof ,如果该表达式为true,则可以安全转换

四、 多态的优缺点

1.优点

  • 提高代码的可扩展性
    多态允许在不修改现有代码的情况下扩展系统功能。通过继承和接口实现,可以轻松添加新的子类或实现类,而无需修改父类或接口的代码。例如,在一个图形绘制程序中,可以通过添加新的子类(如圆形、三角形)来扩展支持的图形类型,而无需修改现有的绘制逻辑。

  • 增强代码的可维护性
    多态将具体实现与接口分离,使得代码结构更加清晰。通过统一的接口调用不同的实现,减少了代码的重复性,降低了维护成本。例如,在支付系统中,可以通过统一的支付接口调用不同的支付方式(如支付宝、微信支付),而无需在业务逻辑中硬编码每种支付方式的具体实现。

  • 提高代码的灵活性
    多态使得程序可以在运行时动态决定调用哪个方法,从而适应不同的场景需求。例如,在游戏开发中,可以根据玩家的选择动态加载不同的角色类,而无需在代码中预先定义所有可能的角色类型。

  • 支持代码复用
    通过继承和多态,子类可以复用父类的代码,同时可以根据需要重写或扩展父类的方法。例如,在动物类中定义通用的行为(如移动、进食),子类(如猫、狗)可以复用这些行为,并根据自身特点进行扩展。

2.缺点

  • 增加代码的复杂性
    多态引入了继承和接口等概念,可能使代码结构变得更加复杂,尤其是当继承层次较深或接口实现较多时。例如,在一个复杂的系统中,可能需要跟踪多个类的继承关系,增加了理解和调试的难度。

  • 性能开销
    多态通常需要在运行时进行动态绑定,这可能导致一定的性能开销。例如,在Java中,虚方法调用需要通过虚方法表(vtable)进行查找,比直接调用静态方法稍慢。

  • 可能导致设计过度抽象
    过度使用多态可能导致设计过于抽象,增加了不必要的复杂性。例如,在一个简单的应用中,如果过度使用接口和抽象类,可能会使代码变得难以理解和维护。

  • 继承的脆弱性
    多态依赖于继承,而继承可能导致父类的修改影响所有子类。例如,如果父类的方法签名或行为发生改变,所有子类可能需要相应调整,增加了维护的难度。

  • 难以调试
    由于多态允许在运行时动态绑定方法,调试时可能难以确定实际调用的方法。例如,在一个多态调用链中,可能需要跟踪多个类的实现,增加了调试的复杂性。

五、总结

  • 多态是Java面向对象编程的灵魂,它让代码具备更高的抽象层次和灵活性。通过继承和接口,我们可以将不同的实现细节封装在子类中,使用父类或接口统一管理,从而降低代码复杂度。在实际开发中,合理运用多态能够显著提升系统的可维护性和扩展性。
  • 希望本文的讲解和示例能帮助您深入理解Java多态的原理与应用!如果有任何疑问,欢迎在评论区交流讨论~

在这里插入图片描述

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

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

相关文章

Python打卡训练营day33——2025.05.22

知识点回顾: PyTorch和cuda的安装 查看显卡信息的命令行命令(cmd中使用) cuda的检查 简单神经网络的流程 数据预处理(归一化、转换成张量) 模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 定义损失函数和优…

uni-app学习笔记九-vue3 v-for指令

v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff1a; <template><view v-for"(item,index) in 10" :key"index"…

【C++算法】70.队列+宽搜_N 叉树的层序遍历

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 429. N 叉树的层序遍历 题目描述&#xff1a; 解法 使用队列层序遍历就可以了。 先入根节点1。queue&#xff1a;1 然后出根节点1&#xff0c;入孩子节点2&#xff0c;3&a…

pycharm无法正常调试问题

pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last):File "E:\Python\pycharm\PyCharm 2023.1\plugins\python\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 304, in _on_runr r.deco…

【机器学习基础】机器学习入门核心算法:线性回归(Linear Regression)

机器学习入门核心算法&#xff1a;线性回归&#xff08;Linear Regression&#xff09; 1. 算法逻辑2. 算法原理与数学推导3. 评估指标4. 应用案例5. 面试题6. 扩展分析总结 1. 算法逻辑 核心思想 通过线性方程拟合数据&#xff0c;最小化预测值与真实值的误差平方和&#xff0…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)

手机打电话时由对方DTMF响应切换多级IVR语音菜单 &#xff08;话术脚本与实战&#xff09; --本地AI电话机器人 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音应答&#xff08;二&#xff09; 下一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音…

flutter dart class语法说明、示例

&#x1f539; Dart 中的 class 基本语法 class ClassName {// 属性&#xff08;字段&#xff09;数据类型 属性名;// 构造函数ClassName(this.属性名);// 方法返回类型 方法名() {// 方法体} }✅ 示例&#xff1a;创建一个简单的 Person 类 class Person {// 属性String name;…

Apollo10.0学习——planning模块(10)之依赖注入器injector_

好不好奇injector_是干什么用的&#xff1f;为什么planning每个模块都要初始化这个变量&#xff1f; 类功能概述 DependencyInjector&#xff08;依赖注入器&#xff09;是一个 集中管理规划模块关键数据和服务 的容器类。它通过提供统一的访问接口&#xff0c;解耦各个组件之…

关于vue彻底删除node_modules文件夹

Vue彻底删除node_modules的命令 vue的node_modules文件夹非常大,常规手段根本无法删除. 解决方法: 在node_modules文件夹所在的路径运行命令窗口,并执行下面的命令. npm install rimraf -g rimraf node_modules说明&#xff1a; npm install rimraf -g 该命令是安装 node…

MCTS-RAG:通过树搜索重塑小模型中的检索增强生成(RAG)

https://arxiv.org/pdf/2503.20757v1这篇论文提出了MCTS-RAG框架&#xff0c;用于解决小型语言模型在知识密集型任务上的推理能力不足问题。具体来说&#xff0c; ​​MCTS-RAG框架​​&#xff1a;MCTS-RAG通过迭代地精炼检索和推理过程来工作。给定一个查询&#xff0c;它探…

数据结构:绪论之时间复杂度与空间复杂度

作者主页 失踪人口回归&#xff0c;陆续回三中。 开辟文章新专栏——数据结构&#xff0c;恳请各位大佬批评指正&#xff01; 文章目录 作者主页 数据结构的基本知识数据&#xff1a;数据元素&#xff1a;数据对象&#xff1a;数据类型&#xff1a;数据结构&#xff1a;逻辑结…

位图算法——判断唯一字符

这道题有多种解法&#xff0c;可以创建hash数组建立映射关系判断&#xff0c;但不用新的数据结构会加分&#xff0c;因此我们有“加分”办法——用位图。 我们可以创建一个整型变量&#xff08;32位&#xff09;而一共才26个字母&#xff0c;所以我们只要用到0-25位即可&#…

深度学习之-目标检测算法汇总(超全面)

YOLO目标检测改进 YOLO V1- YOLO V10: 点这进入https://www.researchgate.net/publication/381470743_YOLOv1_to_YOLOv10_A_comprehensive_review_of_YOLO_variants_and_their_application_in_the_agricultural_domain YOLO V11: YOLO11 &#x1f680;Ultralytics YOLO11 &…

软考中级软件设计师——计算机网络篇

一、计算机网络体系结构 1.OSI七层模型 1. 物理层&#xff08;Physical Layer&#xff09; 功能&#xff1a;传输原始比特流&#xff08;0和1&#xff09;&#xff0c;定义物理介质&#xff08;如电缆、光纤&#xff09;的电气、机械特性。 关键设备&#xff1a;中继器&#…

高等数学-空间中的曲线与曲面

一、 向量的数量积&#xff1a; 直线与直线的夹角&#xff1a; 直线与平面的夹角&#xff1a; 平面与平面的夹角&#xff08;锐角&#xff09;&#xff1a; 方向余弦&#xff1a; 注&#xff1a;空间向量与坐标轴的夹角定义为向量与坐标轴正方向的夹角 例1: 二、 1、z0所…

使用计算机视觉实现目标分类和计数!!超详细入门教程

什么是物体计数和分类 在当今自动化和技术进步的时代&#xff0c;计算机视觉作为一项关键工具脱颖而出&#xff0c;在物体计数和分类任务中提供了卓越的功能。 无论是在制造、仓储、零售&#xff0c;还是在交通监控等日常应用中&#xff0c;计算机视觉系统都彻底改变了我们感知…

javaweb-html

1.交互流程&#xff1a; 浏览器向服务器发送http请求&#xff0c;服务器对浏览器进行回应&#xff0c;并发送字符串&#xff0c;浏览器能对这些字符串&#xff08;html代码&#xff09;进行解释&#xff1b; 三大web语言&#xff1a;&#xff08;1&#xff09;html&#xff1a…

图漾相机错误码解析

文章目录 1.相机错误码汇总2.常见报错码2.1 -1001报错2.1.1 没有找到相机2.1.2 SDK没有进行初始化2.1.3 相机不支持Histo属性 2.2 -1005报错2.2.1 跨网段打开相机2.2.2 旧版本SDK在软触发失败后提示的报错2.2.3 相机初始化上电时报错2.2.4 USB相机被占用 2.3 -1009报错2.3.1 相…

18. 结合Selenium和YAML对页面继承对象PO的改造

18. 结合Selenium和YAML对页面继承对象PO的改造 一、架构改造核心思路 1.1 改造前后对比 #mermaid-svg-ziagMhNLS5fIFWrx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ziagMhNLS5fIFWrx .error-icon{fill:#5522…

将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享

什么是桥接模式&#xff1a;桥接模式&#xff08;Bridging Mode&#xff09;是一种网络连接模式&#xff0c;常用于虚拟机环境中&#xff0c;将虚拟机的虚拟网络适配器直接连接到主机的物理网络适配器上&#xff0c;使虚拟机能够像独立的物理设备一样直接与物理网络通信 1.打开…