八股文-如何理解Java中的多态

23008899a3bcc9acf12aa39d84185ef6.jpg

什么是多态?

多态是面向对象编程的一个重要概念,它允许一个对象以不同的形式表现。也就是说,在父类中定义的属性和方法,在子类继承后,可以有不同的数据类型或表现出不同的行为。这可以使得同一个属性或方法,在父类及其各个子类中,可能会有不同的表现或含义。主要包括两种类型:编译时多态(静态多态)和运行时多态(动态多态)。

  1. 编译时多态(静态多态)

主要体现在方法的重载和重写。方法的重载是在同一个类中,允许定义多个同名方法,但参数列表不同;方法的重写发生在继承关系中,子类可以覆盖父类的方法。

  1. 运行时多态(动态多态)

主要通过对象的多态性和动态绑定实现。引用变量的类型可以是其父类,但在运行时实际引用的是其子类的对象,从而调用子类的方法。

必要条件:

  • 继承或者实现接口

  • 子类重写父类的方法

  • 父类的引用指向子类的对象

多态的实现原理

多态的实现原理涉及到动态绑定和虚拟方法调用。这两个概念有助于理解在运行时如何实现多态性。

  1. 动态绑定(Dynamic Binding)

动态绑定是多态性的基础,它使得在运行时能够确定对象的实际类型,并调用相应类型的方法。在Java中,动态绑定是通过虚拟方法表(Virtual Method Table,VMT)来实现的。

每个类在Java中都有一个与之相关联的虚拟方法表,表中存储了该类的方法的地址。当对象被创建时,会在内存中分配一个虚拟方法表,这个表指向该对象的实际类型的方法地址。

在运行时,当调用一个对象的方法时,通过对象的引用变量找到虚拟方法表,然后根据方法的签名(名称和参数类型)找到相应的方法地址。这个过程是动态的,因为它发生在运行时,根据对象的实际类型来确定调用的方法。

  1. 虚拟方法调用

虚拟方法调用是指在运行时调用对象的方法,而不是在编译时确定调用的方法。在Java中,所有的非私有、非静态、非 final 的方法都是虚拟方法。

  1. 实现流程
  • 创建对象: 在运行时,根据代码中的 new 关键字等创建对象的语句,会在内存中为对象分配空间。

  • 动态绑定: 当对象被创建时,会在内存中分配一个虚拟方法表(VMT)或类似的机制,用于存储对象的方法地址。这个表与对象的实际类型相关联。

  • 引用变量赋值: 引用变量指向对象。在多态中,父类类型的引用变量可以指向子类对象。

  • 虚拟方法调用: 当调用对象的方法时,引用变量根据实际类型找到对象的虚拟方法表,然后根据方法的签名找到相应的方法地址。这个过程是动态的,发生在运行时。

  • 执行方法: 最终执行找到的方法。如果是子类对象,执行的是子类中重写的方法。

整个流程中,关键点在于动态绑定和虚拟方法调用。动态绑定使得在运行时能够确定对象的实际类型,而虚拟方法调用使得在运行时能够调用对象的实际类型中的方法.

多态在实际生产中的应用

  • 代码的灵活性和可维护性

多态性使得代码更加灵活,能够适应不同的场景和需求。通过使用多态性,可以降低代码的耦合度,提高代码的可维护性和可读性。

  • 接口和抽象类的应用

接口和抽象类是实现多态的重要手段。通过定义接口和抽象类,可以在不同的类中实现相同的接口或继承相同的抽象类,从而统一对这些类的处理。

  • 方法回调

多态性在事件处理和回调机制中有广泛应用。通过定义回调接口,不同的类可以实现相同的接口,从而在特定事件发生时调用不同类的方法。

  • 集合中的多态

Java中的集合类(如List、Map)经常使用多态性,允许存储不同类型的对象,使得代码更加通用和灵活。

  • 框架和设计模式

多态性是许多设计模式(如策略模式、工厂模式)和框架的基础。通过设计接口和抽象类,框架能够与不同的实现交互,实现更高层次的灵活性和可扩展性。

总结

多态性使得同一类型的对象在不同情境下表现出不同的行为,从而提高了代码的灵活性和可维护性。编译时多态主要在编译阶段确定调用哪个方法,而运行时多态则在运行时确定调用哪个方法。这种灵活性使得程序能够更容易地适应变化,同时提高了代码的可扩展性。

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

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

相关文章

操作系统 day14(进程同步、进程互斥)

进程同步 概念 进程的异步性体现在,例如:当有I/O操作时,进程需要等待I/O操作,而每个I/O操作又是不同的,所以进程没有一个固定的顺序,固定的时间来执行,而这体现了进程的异步性。 进程互斥 …

freeRTOS异常处理函数分析(以RISC-V架构进行分析)

1、异常处理函数的注册 对RISC-V架构中断不熟悉,可参考博客:《RISC-V架构——中断处理和中断控制器介绍》; 2、异常处理函数分析 2.1、数调用关系 freertos_risc_v_trap_handler //异常处理函数入口portcontextSAVE_CONTEXT_INTERNAL //保存…

Python-pip配置国内镜像源,快速下载包

文章目录 国内镜像源临时使用永久配置添加环境变量Path测试关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 国内…

零代码连接钉钉宜搭与用友U8,让业财数据管理简单高效

零代码连接钉钉宜搭与用友U8,让业财数据管理简单高效 如果把企业内部的业务系统比作一条条河流,那么它们的交汇点就像江河湖海。在这些交汇点上,数据的汇集、分析和共享离不开系统之间的集成。 钉钉宜搭和用友U8是两个在企业中非常重要的系统…

实现电商平台与营销系统无缝集成:雅座的无代码开发与API连接

无代码开发:营销的新引擎 在数字化转型的浪潮中,无代码开发已成为企业提升效率、减少成本的新引擎。这种开发方式允许非技术人员通过图形界面构建应用程序,无需编写代码即可实现复杂功能。这对于营销、广告推广以及用户运营等业务尤为重要&a…

wvp 视频监控平台抓包分析

抓包时机 下面的抓包时机是抓包文件最新,但是最有用的包 选择网卡开始抓包 如果之前已经选择网卡,直接开始抓包 停止抓包 重新抓包 sip播放过程分析 过滤条件 tcp.port 5060 and sip 可以看到有这些包 选择任何一个 ,戍边右键--追踪流--…

JDK21下载+安装+环境配置教程(Windows系统)

前言:甲骨文公司与2023.9发布JDK21,JDK21将是一个长期支持(LTS)版本,JDK20目前可以从官网下载使用。 1,搜索Oracle官网找到JDK21 Java Downloads | Oracle 2,切换Windows系统,然后点击下载&am…

Mysql 不执行索引问题与优化

难以查找的隐藏问题 及 解决办法: 问题总结:

项目demo —— GPT 聊天机器人

本文介绍我的开源项目 TelegramChatBot,这是一个基于 OpenAI GPT API 开发的 telegram 机器人,具有多模态交互能力,求 star!感谢大家!在 telegram jokerController_bot 立即体验!欢迎对 GPT 应用开发或对 t…

【分布式系统学习】CAP原理详解

CAP原理详解 前言CAP一张图 一、概念1.1 关键词解读1.2 关于CAP(拆分解读)1.3 CAP原理精髓 二、CAP模拟场景举例理解三、CAP原理证明为什么不能同时满足(下面举例说明)3.1 必须满足分区容错性P下的处理方式3.2 不是必须满足分区容…

PlantUML语法(全)及使用教程-类图

目录 1. 类图1.1、什么是类图1.2、元素声明1.3、类之间的关系1.4、关系上的标签1.5、在元素名称和关系标签中使用非字母1.6、添加方法 1. 类图 类图的设计语法与编程语言的传统语法相似。这种相似性为开发人员提供了一个熟悉的环境,从而使创建图表的过程更简单、更直…

Golang中rune和Byte,字符和字符串有什么不一样

Rune和Byte,字符和字符串有什么不一样 String Go语言中, string 就是只读的采用 utf8 编码的字节切片(slice) 因此用 len 函数获取到的长度并不是字符个数,而是字节个数。 for循环遍历输出的也是各个字节。 Rune rune 是 int32 …

[数据结构]-map和set

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、键值对…

centos系列:【 全网最详细的安装配置Nginx,亲测可用,解决各种报错】

全网最详细的安装配置Nginx,亲测可用,解决各种报错 全网最详细的安装配置Nginx1、 安装环境依赖2、 下载Nginx包3、编译Nginx4、安装Nginx5、启动Nginx6、配置Nginx7、了解Nginx服务的主配置文件 nginx.conf8、基于授权的访问控制9、基于IP和端口的访问控…

软件设计师——法律法规(一)

📑前言 本文主要是【法律法规】——软件设计师法律法规的题目,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日…

《opencv实用探索·四》Mat图像数据类型转换和归一化显示

一种数据类型转为另一种数据类型,不改变图像大小,但每个像素值可能会变 src.convertTo(dst, type, scale, shift);Scale和shitf默认为0(这两个参数也相当于对比度和亮度) 现在有个8位图像,把8位转成32位 可以看到像素…

SparkRDD及算子-python版

RDD相关知识 RDD介绍 RDD 是Spark的核心抽象,即 弹性分布式数据集(residenta distributed dataset)。代表一个不可变,可分区,里面元素可并行计算的集合。其具有数据流模型的特点:自动容错,位置…

【目标跟踪】光流跟踪(python、c++代码)

文章目录 前言一、代码流程与思路二、python 代码2.1 代码详解2.2 完整代码 三、c 代码四、结果展示 前言 光流利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。…

ModBus电表与RS485电表有哪些区别?

在能源计量领域,ModBus电表和RS485电表是两种常见的设备,它们都具有监测和记录电能数据的功能。然而,它们之间存在一些区别,比如通信协议、连接方式、数据格式等等参数的区别有哪些? ModBus电表和RS485电表都是用于电能…

FreeSWITCH学习笔记:EventSocket

Event Socket命令最后需带有两个换行符。 api 执行API命令。阻塞。 1api API [ARG [ ...]] auth 内连模式下身份验证。需要第一个发送。 1auth PASSWORD bgapi 后台执行API命令。不阻塞。 1bgapi API [ARG [ ...]]2[Job-UUID: UUID] 返回带有Job-UUID。当API命令执行完成…