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

多态的优点

多态的优点

  • 1、多态的优点
    • 1.1 可替换性(Substitutability)
    • 2、可扩充性(Extensibility)
  • 2、总结


💖The Begin💖点点关注,收藏不迷路💖

1、多态的优点

在面向对象编程(OOP)中,多态性(Polymorphism)是一个非常重要且强大的概念。本文将讨论多态的两个主要优点:可替换性和可扩充性。

1.1 可替换性(Substitutability)

多态性的一个显著优点是它提供了代码的可替换性。这意味着可以使用一个子类的实例来替代父类的实例,而不会影响程序的正确性和功能。

示例:

假设我们有一个Shape基类和它的两个子类CircleRing。通过多态性,我们可以编写如下代码:

public class Shape {public void draw() {System.out.println("绘制一个形状");}
}public class Circle extends Shape {@Overridepublic void draw() {System.out.println("绘制一个圆形");}
}public class Ring extends Shape {@Overridepublic void draw() {System.out.println("绘制一个环形");}
}public class Main {public static void main(String[] args) {Shape shape1 = new Circle();Shape shape2 = new Ring();shape1.draw(); // 输出: 绘制一个圆形shape2.draw(); // 输出: 绘制一个环形}
}

在上述代码中,虽然shape1和shape2是用父类Shape的引用定义的,但它们实际指向的是子类Circle和Ring的对象。当我们调用draw方法时,会根据实际对象类型执行相应的方法。这就是多态性的可替换性。

2、可扩充性(Extensibility)

多态性还使得代码具有很好的可扩充性。也就是说,当增加新的子类时,不需要修改现有的代码,就能保证新类的多态性、继承性以及其他特性的运行和操作。

示例:

继续前面的例子,如果我们现在增加一个新的子类Rectangle:

public class Rectangle extends Shape {@Overridepublic void draw() {System.out.println("绘制一个矩形");}
}

我们只需添加一行代码即可在主程序中使用新的子类:

public class Main {public static void main(String[] args) {Shape shape3 = new Rectangle();shape3.draw(); // 输出: 绘制一个矩形}
}

增加新的子类Rectangle并不需要更改现有的代码,现有的多态机制仍然有效。这大大提高了代码的可扩充性。

2、总结

多态性是面向对象编程中的核心特性之一,它带来了以下两个主要优点:

1、可替换性:允许用子类对象替代父类对象,增强了代码的灵活性。

2、可扩充性:允许添加新的子类而不需要修改现有代码,提高了代码的可维护性和扩展性。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关文章:

  • R语言进行字符的替换和删减gsub,substr函数
  • vue3中若v-model绑定的响应字段出现三级,该如何实现rules验证规则
  • 视图库对接系列(GA-T 1400)九、视图库对接系列(本级)机动车数据推送
  • 前端技术(二)——javasctipt 介绍
  • 【RAG检索增强生成】MaxKB:构建企业级知识库问答系统(Ollama+Qwen2)
  • 论文阅读YOLO-World: Real-Time Open-Vocabulary Object Detection
  • 快速排序c++java代码实现
  • 全网最简单的Java设计模式【三】工厂方法模式详解
  • 实现点击按钮导出页面pdf
  • Android super.img结构及解包和重新组包
  • Android Gradle开发与应用Gradle详细使用
  • STM32第十四课:低功耗模式和RTC实时时钟
  • 「C++系列」C++ 变量作用域
  • 谈谈检测浏览器类型
  • Jenkins 使用 Publish over SSH进行远程访问
  • 【译】JS基础算法脚本:字符串结尾
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • golang 发送GET和POST示例
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Javascript编码规范
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • npx命令介绍
  • Redux 中间件分析
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • zookeeper系列(七)实战分布式命名服务
  • 编写符合Python风格的对象
  • 产品三维模型在线预览
  • 工程优化暨babel升级小记
  • 想写好前端,先练好内功
  • 小而合理的前端理论:rscss和rsjs
  • 一个JAVA程序员成长之路分享
  • 《天龙八部3D》Unity技术方案揭秘
  • UI设计初学者应该如何入门?
  • 带你开发类似Pokemon Go的AR游戏
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​flutter 代码混淆
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Java NIO(一)FileChannel
  • #LLM入门|Prompt#3.3_存储_Memory
  • #WEB前端(HTML属性)
  • #在 README.md 中生成项目目录结构
  • (09)Hive——CTE 公共表达式
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (待修改)PyG安装步骤
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (七)理解angular中的module和injector,即依赖注入
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • .htaccess配置常用技巧
  • .NET Project Open Day(2011.11.13)
  • .net知识和学习方法系列(二十一)CLR-枚举
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)