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

【Java】多态性【主线学习笔记】

文章目录

  • 前言
  • 多态性
    • 1、编译时多态性(静态多态性):
    • 2、运行时多态性(动态多态性)
    • 3、多态性的实用性
    • 4、多态性的优点与弊端
  • 下一篇
    • 点击跳转《【Java】多态性-向下转型【主线学习笔记】》


前言

Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。


多态性

在 Java 中,多态性是一种面向对象编程的特性,允许同一个方法或对象在不同的上下文中表现出不同的行为。多态性通过方法重写(Override)和方法重载(Overload)来实现,可以使代码调用更加灵活和可扩展。

1、编译时多态性(静态多态性):

方法重载是指同一个类中可以有多个同名的方法,但参数类型或参数数量不同。编译器会在编译时根据方法的参数来决定调用哪个方法。

class Example {void display(int a) {System.out.println("整数: " + a);}void display(String a) {System.out.println("字符串: " + a);}
}public class Test {public static void main(String[] args) {Example obj = new Example();obj.display(10);  // 输出:整数: 10obj.display("Hello");  // 输出:字符串: Hello}
}

2、运行时多态性(动态多态性)

方法重写是指子类提供了父类方法的具体实现。在运行时,Java会根据实际对象的类型来调用对应的方法,这就是动态多态性。运行时多态性是通过继承和方法重写来实现的,它使得程序能够根据实际对象的类型来执行相应的行为。

// 父类 BankCard,代表通用的银行卡
class BankCard {// 模拟刷卡方法void swipe() {System.out.println("使用银行卡刷卡");}
}// 子类 CreditCard,代表信用卡
class CreditCard extends BankCard {@Overridevoid swipe() {System.out.println("使用信用卡刷卡并提供信用额度");}
}// 子类 DebitCard,代表借记卡
class DebitCard extends BankCard {@Overridevoid swipe() {System.out.println("使用借记卡刷卡并扣除账户余额");}void shape(){System.out.println("这是一个长方形的卡");}
}// 消费类,模拟支付场景
class PaymentProcessor {// 动态多态性体现在这里,使用父类 BankCard 作为参数public void processPayment(BankCard card) {card.swipe();  // 调用的是具体卡片对象的 swipe() 方法}
}// 测试类
public class TestPolymorphism {public static void main(String[] args) {PaymentProcessor processor = new PaymentProcessor();// 使用信用卡进行支付processor.processPayment(new CreditCard());  // 输出:使用信用卡刷卡并提供信用额度// 使用借记卡进行支付processor.processPayment(new DebitCard());  // 输出:使用借记卡刷卡并扣除账户余额}
}

3、多态性的实用性

适用于方法,不适用于属性。

4、多态性的优点与弊端

  • 优点:在软件系统的各种组件中,如模块、类、功能等,应该在不修改现有代码的基础上,引入新功能。极大的减少了代码的冗余,不需要定义多个重载的方法。
  • 弊端:不能直接调用Man中的特有属性和方法。例如上面的银行卡案例,在消费类模拟支付场景的类中,是无法使用card.shape()这一方法,因为声明为父类的引用,所以你无法预先判断传进来的card是子类借记卡还是信用卡又或者是父类银行卡类别。

下一篇

点击跳转《【Java】多态性-向下转型【主线学习笔记】》

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • qt QGraphicsScene场景坐标和场景内GraphicsItem局部坐标的相互转换
  • 2024.9 学习笔记
  • axure判断
  • 3分钟带你快速了解 Java 接口
  • 模板:软件验收文档
  • 【STM32系统】基于STM32设计的智能垃圾桶(语音、颜色识别、称重、光强、烟雾、人体识别、步进电机、水泵)——文末资料下载
  • 157-安全开发-Python 自动化挖掘项目SRC 目标FOFA 资产Web 爬虫解析库
  • oracle 条件取反
  • discuz论坛3.4 截图粘贴图片发帖后显示不正常问题
  • Qt_控件的QWidget属性介绍
  • C/C++调试工具GDB简单介绍
  • 蓝桥杯真题——数星星
  • gitlab无法push(pre-receive hook declined)
  • vue3 响应式 API:readonly() 与 shallowReadonly()
  • MMdetection改进的目标检测算法
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • ES学习笔记(12)--Symbol
  • java8-模拟hadoop
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SQLServer插入数据
  • 高程读书笔记 第六章 面向对象程序设计
  • 配置 PM2 实现代码自动发布
  • 前端技术周刊 2019-02-11 Serverless
  • 前嗅ForeSpider采集配置界面介绍
  • 深度学习入门:10门免费线上课程推荐
  • 微信开放平台全网发布【失败】的几点排查方法
  • 在Mac OS X上安装 Ruby运行环境
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (2)空速传感器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (poj1.3.2)1791(构造法模拟)
  • (差分)胡桃爱原石
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (未解决)macOS matplotlib 中文是方框
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .bat批处理出现中文乱码的情况
  • .net dataexcel 脚本公式 函数源码
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET中分布式服务