JAVA的多态

在Java中,多态(Polymorphism)是面向对象编程的三大特性之一,它允许一个引用变量在运行时引用不同类的对象,并根据实际对象的类型来执行对应的方法。多态的存在增加了代码的灵活性和可扩展性。

多态的实现通常依赖于以下机制:

  1. 方法重写(Override):子类可以重写父类的方法,即子类可以提供一个与父类方法签名相同的方法。当使用父类类型的引用指向子类对象,并调用这个方法时,会执行子类中的重写方法,而不是父类中的方法。

  2. 向上转型(Upcasting):这是将子类的对象赋值给父类类型的引用变量。由于子类继承了父类,所以子类对象可以当作父类对象来使用。向上转型是安全的,因为它不会丢失任何信息。

  3. 方法重载(Overloading) 和 接口:虽然方法重载和接口本身不是多态的直接表现,但它们经常与多态一起使用。方法重载提供了在同一个类中根据参数列表的不同来执行不同方法的能力。接口则允许一个类实现多个接口,从而具有多种类型的行为。

下面是一个简单的Java多态示例:

class Animal {  void makeSound() {  System.out.println("The animal makes a sound");  }  
}  class Dog extends Animal {  @Override  void makeSound() {  System.out.println("The dog barks");  }  
}  class Cat extends Animal {  @Override  void makeSound() {  System.out.println("The cat meows");  }  
}  public class Main {  public static void main(String[] args) {  Animal animal1 = new Dog(); // 向上转型,Dog对象被视为Animal对象  Animal animal2 = new Cat(); // 向上转型,Cat对象被视为Animal对象  animal1.makeSound(); // 输出 "The dog barks"  animal2.makeSound(); // 输出 "The cat meows"  }  
}//在这个例子中,Dog 和 Cat 都继承自 Animal 类,并重写了 makeSound 方法。
//在 main 方法中,我们创建了 Dog 和 Cat 的对象,但是我们将它们赋值给了 Animal 类型的引用变量 //animal1 和 animal2。当我们调用 makeSound 方法时,实际执行的是对应子类(Dog 或 Cat)中的方
//法,这就是多态的表现。

多态还常常与接口一起使用,因为接口定义了方法的契约,而不同的类可以实现这个接口并提供不同的实现。这样,使用接口类型的引用就可以引用实现了该接口的任何类的对象,并在运行时调用其实现的方法。

注意,为了实现多态,子类重写的方法的访问权限不能低于父类中被重写方法的访问权限。如果父类中的方法是 public 的,那么子类中的重写方法也必须是 public 的。如果访问权限降低了,那么这将不再是重写,而是新的方法,多态将不会发生。

Java中的多态性带来了许多好处,这些好处使得代码更加灵活、可重用和易于维护。以下是Java多态性的主要好处:

代码复用和灵活性
多态允许使用父类类型的引用来引用子类对象,这意味着你可以编写通用的代码来处理父类类型,而不需要关心具体的子类实现。这极大地提高了代码的复用性,因为你可以编写一次代码,然后在多个不同的上下文中使用它。

扩展性
多态使得在不修改现有代码的情况下,能够添加新的子类并赋予它们不同的行为成为可能。这意味着当需要添加新功能或行为时,只需创建新的子类并覆盖父类的方法,而不需要修改使用父类类型的现有代码。

简化代码结构
通过使用多态,可以减少条件语句和类型检查的数量,使得代码更加简洁和易于理解。多态允许程序在运行时确定实际要执行的方法,而不是在编译时。

开闭原则的支持
多态性符合开闭原则,即软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着当需要添加新功能时,应该通过添加新的代码(例如新的子类),而不是修改现有的代码。

接口和抽象类的使用
多态与接口和抽象类的结合使用,使得代码更加模块化和可维护。接口定义了方法的契约,而不同的类可以实现这些接口以提供不同的行为。抽象类则允许定义部分实现和共享的代码,子类可以继承这些实现并添加自己的特定逻辑。

易于测试和调试
多态使得代码更易于测试和调试,因为你可以通过替换子类来改变程序的行为,而无需修改其他部分的代码。这允许你更容易地隔离和修复问题。

设计模式的实现
多态是许多设计模式(如工厂模式、单例模式、观察者模式等)的基础。这些设计模式利用多态性来提供灵活和可维护的代码结构。

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

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

相关文章

一文掌握python上下文管理器(with语句)

目录 一、上下文管理协议 二、with 语句 三、自定义上下文管理器 四、生成器上下文管理器 五、几个常用例子 1、自动关闭网络连接 2、临时更改目录 3、数据库事务管理 4、计时器上下文管理器 5、日志记录上下文管理器 6、资源锁定上下文管理器 7、临时修改环境变量…

windows远程访问树莓派ubuntu22.04 桌面 - NoMachine

通过nomachine 实现 windows 安装 nomachine 下载:链接:https://pan.baidu.com/s/10rGBREs-AnwRz7D7QbLQ1A?pwd8651 提取码:8651 安装:下一步 下一步 使用: 下一步 下一步 ubuntu 安装 nomachine服务 下载&#…

Java基础知识总结(81)

JUC容器 JUC基于非阻塞算法(Lock Free 无锁编程)提供了一组高并发的List、Set、Queue、Map容器。 JUC高并发容器是基于非阻塞算法实现的容器类,无锁编程算法主要通过CAS(Compare And Swap)volatile的组合实现&#x…

【C++程序员的自我修炼】string 库中常见的用法 (一)

唤起一天明月照我满怀冰雪浩荡百川流鲸饮未吞海 剑气已横秋 目录 string 库的简介 string 的一些小操作 构造函数的使用 拷贝构造的常规使用 指定拷贝内容的拷贝构造 拷贝字符串开始的前 n 个字符 用 n 个字符初始化 计算字符串的长度 string 的三种遍历方式 常规的for循环 op…

利用大型语言模型提升数字产品创新:提示,微调,检索增强生成和代理的应用

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Linux基础part-6

一、Shell编程理论和运用 1、程序的编程风格和执行模式 编程风格(Programming Style) 过程式编程:以指令为中心,来进行写程序,数据服务于指令。(bash shell) C 以指令为中心,程序的逻辑由一系…

「笔试刷题」:字母收集

一、题目 描述 有一个 𝑛∗𝑚 的矩形方阵,每个格子上面写了一个小写字母。 小红站在矩形的左上角,她每次可以向右或者向下走,走到某个格子上就可以收集这个格子的字母。 小红非常喜欢 "love" 这四个字母。…

FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流

OBS是一个开源的直播录制软件,英文全称叫做Open Broadcaster Software,广泛用于视频录制、实时直播等领域。OBS不但开源,而且跨平台,兼容Windows、Mac OS、Linux等操作系统。 OBS的官网是https://obsproject.com/,录制…

【报错处理】ib_write_bw执行遇到Couldn‘t listen to port 18515原因与解决办法?

要点 要点: ib默认使用18515端口 相关命令: netstat -tuln | grep 18515 ib_write_bw --help |grep port# server ib_write_bw --ib-devmlx5_1 --port88990 # client ib_write_bw --ib-devmlx5_0 1.1.1.1 --port88990现象: 根因&#xff…

为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用

本文介绍了某省妇幼健康管理系统的建设和数据库架构优化的过程。原有的数据库架构使用了 StarRocks 作为分析层,但随着业务的发展,这套架构暴露出诸多痛点,不再适应妇幼业务的需求。为解决这些问题,该系统选择了将原有架构中的 St…

OBSERVER(观察者)-- 对象行为模式

意图: 定义对象间地一种一对多地依赖关系,当一个对象地状态发生改变时,所有对于依赖于它的对象都得到通知并被自动更新。 别名: 依赖(Dependents), 发布-订阅(Publish-Subsribe) 动机: 将一个系统分割成一系列相互协…

使用Python及R语言绘制简易数据分析报告

Pytohn实现 在python中有很多包可以实现绘制数据分析报告的功能,推荐两个较为方便的包:pandas-profiling 和 sweetviz 。 使用 pandas-profiling 包(功能全面) 这个包的个别依赖包与机器学习的 sklearn 包的依赖包存在版本冲突&a…

【C++中的模板】

和你有关,观后无感................................................................................................................. 目录 前言 一、【模板的引入和介绍】 1、泛型编程 2、【模板的介绍】 二、【 函数模板】 2.1【模函数板的介绍】 1.…

修改word文件的创作者方法有哪些?如何修改文档的作者 这两个方法你一定要知道

在数字化时代,文件创作者的信息往往嵌入在文件的元数据中,这些元数据包括创作者的姓名、创建日期以及其他相关信息。然而,有时候我们可能需要修改这些创作者信息,出于隐私保护、版权调整或者其他实际需求。那么,有没有…

【开源设计】京东慢SQL组件:sql-analysis

京东慢SQL组件:sql-analysis 一、背景二、源码简析三、总结 地址:https://github.com/jd-opensource/sql-analysis 一、背景 开发中,无疑会遇到慢SQL问题,而常见的处理思路都是等上线,然后由监控报警之后再去定位对应…

vue 前端读取Excel文件并解析

前端读取Excel文件并解析 前端如何解释Excel呢 平时项目中对于Excel的导入解析是很常见的功能,一般都是放在后端执行;但是也有特殊的情况,偶尔也有要求说前端执行解析,判空,校验等,最后组装成后端接口想要的…

【大数据】利用 Apache Ranger 管理 Amazon EMR 中的数据权限

利用 Apache Ranger 管理 Amazon EMR 中的数据权限 1.需求背景简介2.系统方案架构图3.主要服务和组件简介3.1 Amazon EMR3.2 Simple Active Directory3.3 Apache Ranger 4.部署步骤4.1 部署 Simple AD 服务4.2 部署 Apache Ranger4.3 部署 Amazon EMR4.4 在 Amazon EMR 的主节点…

【数据结构】二叉树(带图详解)

文章目录 1.树的概念1.2 树的结构孩子表示法孩子兄弟表示法 1.3 相关概念 2.二叉树的概念及结构2.1 二叉树的概念2.2 数据结构中的二叉树-五种形态2.3 特殊的二叉树2.4 二叉树的存储结构顺序存储链式存储 2.5 二叉树的性质 3. 堆3.1 堆的定义3.2 堆的实现堆的结构堆的插入向上调…

java技术栈快速复习02_前端基础知识总结

前端基础 经典三件套: html(盒子)css(样式)JavaScript(js:让盒子动起来) html & css HTML全称:Hyper Text Markup Language(超文本标记语言),不是编程语…

不科学上网使用Hugging Face的Transformers库

参考 Program Synthesis with CodeGen — ROCm Blogs (amd.com) HF-Mirror - Huggingface 镜像站 https://huggingface.co/docs/transformers/v4.40.1/zh/installation#%E7%A6%BB%E7%BA%BF%E6%A8%A1%E5%BC%8F 准备 apt show rocm-libs -a pip install transformers python …