Java多态的底层原理

MPU6050的四元数解算姿态方法 使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法。 我们先来看看如何用欧拉角描述一次平面旋转(坐标变换): MPU6050的四元数解算姿态方法 设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。 转换成矩阵形式表示为: 即 所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次: MPU6050的四元数解算姿态方法 上面得到了一个表示旋转的方 阅读详情

作为一门面向对象语言,Java 拥有封装、继承、多态三大特性。多态就是允许不同类的对象对同一消息做出响应。基于多态,可以消除一些类型耦合关系,实现可替换、可扩充。Java 中使用多态特性的方法主要有,实现一个接口,实现抽象类的一个方法,覆盖父类的一个方法。

多态的底层实现是动态绑定,即在运行时才把方法调用与方法实现关联起来。动态绑定涉及很多 JVM 的细节,全部写清楚需要很大篇幅,因此本文仅简单描述,后续会有其他文章就其中的细节一一分享。

静态绑定与动态绑定

JVM 的方法调用指令有五个,分别是:

invokestatic:调用静态方法;

invokespecial:调用实例构造器

方法、私有方法和父类方法;

invokevirtual:调用虚方法;

invokeinterface:调用接口方法,运行时确定具体实现;

invokedynamic:运行时动态解析所引用的方法,然后再执行,用于支持动态类型语言。

小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!

其中,invokestatic 和 invokespecial 用于静态绑定,invokevirtual 和 invokeinterface 用于动态绑定。可以看出,动态绑定主要应用于虚方法和接口方法。

静态绑定在编译期就已经确定,这是因为静态方法、构造器方法、私有方法和父类方法可以唯一确定。这些方法的符号引用在类加载的解析阶段就会解析成直接引用。因此这些方法也被称为非虚方法,与之相对的便是虚方法。

虚方法的方法调用与方法实现的关联(也就是分派)有两种,一种是在编译期确定,被称为静态分派,比如方法的重载;一种是在运行时确定,被称为动态分派,比如方法的覆盖。对象方法基本上都是虚方法。

这里需要特别说明的是,final 方法由于不能被覆盖,可以唯一确定,因此 Java 语言规范规定 final 方法属于非虚方法,但仍然使用 invokevirtual 指令调用。静态绑定、动态绑定的概念和虚方法、非虚方法的概念是两个不同的概念。

多态的实现

在前文《Java线程知识拾遗》中提到过,虚拟机栈中会存放当前方法调用的栈帧,在栈帧中,存储着局部变量表、操作栈、动态连接 、返回地址和其他附加信息。多态的实现过程,就是方法调用动态分派的过程,通过栈帧的信息去找到被调用方法的具体实现,然后使用这个具体实现的直接引用完成方法调用。

以 invokevirtual 指令为例,在执行时,大致可以分为以下几步:

1、先从操作栈中找到对象的实际类型 class;

2、找到 class 中与被调用方法签名相同的方法,如果有访问权限就返回这个方法的直接引用,如果没有访问权限就报错 java.lang.IllegalAccessError ;

3、如果第 2 步找不到相符的方法,就去搜索 class 的父类,按照继承关系自下而上依次执行第 2 步的操作;

4、如果第 3 步找不到相符的方法,就报错 java.lang.AbstractMethodError ;

可以看到,如果子类覆盖了父类的方法,则在多态调用中,动态绑定过程会首先确定实际类型是子类,从而先搜索到子类中的方法。这个过程便是方法覆盖的本质。

实际上,商用虚拟机为了保证性能,通常会使用虚方法表和接口方法表,而不是每次都执行一遍上面的步骤。以虚方法表为例,虚方法表在类加载的解析阶段填充完成,其中存储了所有方法的直接引用。也就是说,动态分派在填充虚方法表的时候就已经完成了。

在子类的虚方法表中,如果子类覆盖了父类的某个方法,则这个方法的直接引用指向子类的实现;而子类没有覆盖的那些方法,比如 Object 的方法,直接引用指向父类或 Object 的实现。

渗透测试自学日志之漏洞复现篇:漏洞列表 复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关 阅读详情

相关推荐

从图片到3D模型:用Tripo+Unity打造AI建模流水线(避坑指南)

本文详细介绍了如何利用Tripo和Unity构建AI驱动的3D建模流水线,从图片到3D模型的高效转换。通过文生模型和图生模型的双模系统,开发者可以大幅提升建模效率,适用于游戏开发和数字内容创作。文章还提供了环境配置、图片预处理、批量生成等实用技巧,帮助开发者避开常见陷阱。

weixin_27024175的博客 617

Java多态的底层实现原理

一.多态的前提: 1.继承 2.重写 3.向上转型(这里的向上转型即父类型的引用指向子类型的实例) 二.类的加载 首先得介绍一下JVM的大体结构: 类先被加载进来。。。。。。(类的加载过程)得到class文件 class文件载入JVM在方法区上得到并且建立储存该类的类型信息(就是一些成员变量,类变量,方法等) ...

weixin_42178281的博客 3072

图像去模糊(二)——Richardson–Lucy算法

Richardson Lucy Algorithm(Richardson-Lucy算法详解及效果实例)

xueruhongchen的博客 3万+

java多态理解和底层实现原理剖析

这里的关键点在于实例变量和实例方法在数组中的占据的索引位置是不变的 ,例如: 子类继承了某个父类,子类自己的方法表中也是父类方法优先,接着是自己的方法,这样可以确保父类方法在子类和父类方法表中的索引都是一致的。超类的方法出现在来自子类的方法前,并且方法表中方法指针排序顺序和方法在class文件中出现顺序相同,当然,如果存在子类覆盖父类方法的情况,那么子类覆盖的方法会出现在超类中该方法第一次出现的位置。相反,当虚拟机调用一个实例方法时,它会基于对象的实际类型(运行时确定)来选择调用的方法。

m0_53157173的博客 1472

Coze知识库搭建:智能化管理与高效检索实践

知识管理系统是现代企业信息资产管理的核心基础设施,其核心原理是通过结构化存储和智能检索技术实现知识的快速流转。在技术实现上,基于NLP的语义理解引擎和知识图谱构建是关键,能够显著提升检索准确率和知识关联性。以Coze平台为例,其针对中文场景优化的分词算法和多模态处理能力,可有效解决技术文档管理中的术语识别和格式兼容问题。这类系统在开发团队知识沉淀、新员工培训等场景中价值显著,特别是当集成RBAC权限模型和自动化备份策略后,既能保障信息安全,又能实现持续的知识迭代。通过合理配置同义词扩展和权重调整,可使搜索命

weixin_29041195的博客 262

解决Qt平台插件初始化失败:This application failed to start because no Qt platform plugin could be initialized

本文深入解析了Qt应用程序启动时常见的‘platform plugin’初始化失败报错,指出其核心在于环境变量冲突或多版本Qt共存导致的插件路径混乱。文章提供了从环境变量检查、路径调整到文件补全的完整解决方案,并给出了使用windeployqt工具等预防性开发实践,帮助用户和开发者彻底解决这一经典问题。

weixin_29229261的博客 2216

图解java多态的原理

通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状 态。(就像榨汁机,放入不同水果得到不同的果汁) 1.对象头的Klass Pointer始终指向的是传入对象的类对象 2.类对象的函数调用表,如果派生类重写了父类的方法,在函数调用表中,派生类方法的引用会覆盖父类方法的引用

weixin_72224952的博客 2602

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 191

java多态底层实现原理

1.Java多态概述 多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevitual)和接口引用调用(invokeinterface)的实现则有所不同。 类引用调用的大致过程为:Java编译器将Java源代码编译成class文件,在编译过程中,会根据静态...

scofen的博客 1613

60、新型共轴直升机建模与事件触发积分强化学习研究

本文研究了新型共轴直升机的动力学建模与控制方法,基于牛顿-欧拉方程建立了6自由度非线性模型,并设计了四通道闭环控制器实现稳定飞行。同时,提出一种事件触发积分强化学习方法,用于解决非零和博弈中的最优跟踪控制问题,在减少通信开销的同时保证系统性能。通过仿真验证了控制器的轨迹跟踪能力,并证明了算法下跟踪误差与神经网络权重估计误差的一致最终有界性。两种方法协同可提升飞行器的自主性与鲁棒性,未来可拓展至多智能体协作、智能交通等复杂系统应用。

rl6adventurer的博客 118

python爬取银行年报2

python爬取公司年报(巨潮资讯网)

bboysteed的博客 4731

深入浅出 Java 多态:从原理到实践的全面解析

子类对象可以赋值给父类引用变量,通过父类引用调用方法时,实际执行的是子类重写后的方法。简单来说,就是 “编译时看父类,运行时看子类// 父类:交通工具// 统一行为:行驶System.out.println("交通工具正在行驶");// 子类:汽车(继承交通工具)// 重写行驶行为:汽车的实现@OverrideSystem.out.println("汽车靠四个轮子滚动行驶");// 子类:自行车(继承交通工具)// 重写行驶行为:自行车的实现@Override。

asad6的博客 1379

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【最大化游戏试玩资格分发】

新研发了一台游戏设备可以面向用户接受试玩。现有 n 个试玩申请,每个试玩有开始时间和结束时间。作为协调员,为了能让更多人体验到游戏,你需要对试玩申请进行选择,使得:

MISAYAONE的博客 293

【Java基础篇】多态底层原理

​ 多态的底层原理是方法后期的动态绑定,由于Java是由C和C++实现的,所以多态的原理和C++是类似的,一个类会对应一个虚函数表,而且Java中的所有非静态的方法、非final修饰的方法、非private方法都是虚函数。​ 总结:当通过父类的引用调用一个方法时,JVM会查找该对象的虚函数表,找到对应方法的虚函数指针并调用,此时查找的是子类的虚函数表,所以调用的方法子类也是重写后的方法,所以就实现了使用父类的引用调用子类的方法,这便是多态的底层原理。方法,所以调用的是重写后的。对象的虚函数表,因为。

m0_53732433的博客 541

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java多态的底层原理

虚拟机运行角度解释多态实现原理 动态绑定、方法表 将一个方法调用同一个方法主体关联起来被称作绑定,JAVA中分为前期绑定和后期绑定(动态绑定) 在程序执行之前进行绑定(由编译器和连接程序实现)叫做前期绑定 因为在编译阶段被调用方法的直接地址就已经存储在方法所属类的常量池中了,程序执行时直接调用 (invokestatic指令),如,final,static,private,构造方法,成员变...

大数据 3298

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

夯实Java基础系列23:深入理解Java继承、封装、多态的底层实现原理

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透...

Java技术江湖 7773

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java 底层原理_Java 多态的底层原理

作为一门面向对象语言,Java 拥有封装、继承、多态三大特性。多态就是允许不同类的对象对同一消息做出响应。基于多态,可以消除一些类型耦合关系,实现可替换、可扩充。Java 中使用多态特性的方法主要有,实现一个接口,实现抽象类的一个方法,覆盖父类的一个方法。多态的底层实现是动态绑定,即在运行时才把方法调用与方法实现关联起来。动态绑定涉及很多 JVM 的细节,全部写清楚需要很大篇幅,因此本文仅简单描述...

weixin_32801929的博客 281

从JVM的角度来看Java多态的底层原理

继承和实现是我们平时使用最多的基础内容之二吧,那么这两者的底层实现原理到底是什么呢?从JVM的角度如何看继承和实现呢?

张姐姐聊编程 1668

总结一下,java多态底层原理

内容简介: 本书一共15章,核心内容为SpringBoot、SpringCloud、Docker、RabbitMQ消息组件。其中,SpringBoot是SpringMVC技术的延伸,使用它进行程序开发会更简单,服务整合也会更容易。SpringCloud是当前微架构的核心技术方案,属于SpringBoot的技术延伸,它可以整合云服务,基于RabbitMQ和 GITHUB进行微服务管理。除此以外,本书还重点分析了OAuth统一认证服务的应用。由于笔记的内容太多,没办法全部展示出来,在此只截取部分内容展示。

CHAMPION8888的博客 164

java多态的底层原理,先收藏了

Java核心架构笔记大致如下 0~1年: Java基础(基本语法、面向对象、继承、多态、接口和抽象类、异常、内部类、集合、泛型、反射、I/O等) Web编程(Servlet+MySQL数据库+商品管理系统实战) SSM框架入门到精通(Spring+SpringMVC+Mybatis+SSM商品管理系统实战) SpringBoot(SpringBoot+SpringBoot商品管理系统实战) 1~3年: JVM深度进阶(JVM内存区域+JVM运行时内存+垃圾回收与算法+JAVA 四种引用类型+GC分代收

m0_57205780的博客 237

Java继承和多态的底层原理

当子类继承父类以后,子类的对象为什么可以访问到父类中定义的方法?当子类Override了父类中的方法以后,访问的是子类Override以后的方法,这是怎么实现的?当子类Override了父类的方法以后,还有办法得到父类的方法吗?博客:重写(overwrite)、重载(overload)和覆盖(override)三者之间的区别 子类已经覆盖了父类,并且重写了父类的方法, 一般来说, 就没有必要用子...

让兔子飞得更高 2496

java 继承 底层实现的_夯实Java基础系列23:一文读懂继承、封装、多态的底层实现原理...

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2playlife.com从JVM结构开始谈多态Java 对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用和接口引用调用的实现则有所不同。总体而言,当某个方法被调用时,JVM 首先要查找相应的常量池,得到方法的符号引用,并查找调用...

weixin_36328527的博客 248

Java多态与接口深度解析:从底层原理到工程实践

面向对象编程中,多态和接口是两大核心机制,它们共同决定了代码的扩展性与可维护性。多态通过动态绑定让同一调用在不同对象上呈现不同行为,而接口则作为稳定的抽象契约,将调用方与具体实现解耦。理解其底层原理,如虚方法表、静态绑定与动态绑定,是写出高质量代码的基础。在工程实践中,利用接口与策略模式替代冗长的条件分支,可以显著降低新增业务类型的成本,遵循开闭原则,提升系统的可演进性。无论是处理支付渠道、告警通知还是结算规则等典型场景,掌握多态与接口的设计边界,都能帮助开发者构建更健壮、易测试的Java应用。本文从底层机

weixin_33428613的博客 255
上一篇: JAVA基础学习之JAVA中的包总结!
下一篇: 30个Java编码规范!培养良好的编码习惯!
java03_15
博客等级 码龄9年 263粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值