Java多态原理

参考

虚方法

  • JVM杂记:对多态实现原理、虚方法表、虚方法、静态解析、动态链接的一些思考_多态和方法表的关系-CSDN博客

静态分派与动态分派

  • (JVM)Java虚拟机:静态分派 & 动态分派 原理解析 - 掘金

虚方法表

  • JVM 栈帧,静态、动态分派以及虚方法表 - 掘金

背景知识

1、静态类型与动态类型

例子

Human a = new Man()a = new Woman()

静态类型:

变量a的静态类型 = 引用类型 = Human:不会被改变、在编译器可知

动态类型:

变量a的动态类型 = 实例对象类型 = Man:会变化、在运行期才可知

2、虚方法与非虚方法

概念

非虚方法:如果方法在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称为非虚方法。静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法

虚方法:其他方法就叫做非虚方法

理解

不能被重写的方法都是非虚方法

3、静态分派与动态分派

静态分派

概念

根据对象的静态类型来进行分配,即根据变量的静态类型确定执行哪个方法

理解

1、非虚方法的执行都是静态分派

2、在编译成字节码文件的时候,就已经确定调用哪个方法了,所以由编译器来确定

字节码文件中就已经说明了是哪个类的方法,分号后面的就是

3、类加载的时候,在解析阶段符号引用就可以直接转化为直接引用

方法重载

说明

方法重载虽然也用到了虚方法,而且指令也是虚方法指令,但他是静态分派

概念

方法重载(OverLoad) = 静态分派 = 根据 变量 的静态类型 确定执行(重载)哪个方法

细节

类型强转

类型强转实际上是创建一个新对象,而不是修改原有的对象

例子

Person a = new Person()(Man) a

此时会创建一个新的静态类型为Man的对象。

动态分派

概念

根据对象的动态类型来进行分配

理解

1、使用到多态的地方(使用虚方法 ,方法重载的情况除外)就是动态分派

2、在编译的时候,无法确定是要调用哪个类的方法,只有在运行的时候才能确定,由JVM来确定

3、类加载的时候,在解析阶段无法转化为直接引用,只有在运行时才能解析

方法重写原理

1、运行时调用到虚方法的时候,会去找动态类型,而不是静态类型

2、然后把符号引用转化为直接引用

4、虚方法表

概念

每个类都有一个虚方法表,这个放在方法区中,记录了当前这个类重写的方法,如果没有重写父类的方法,虚方法表中不会记录

背景

当动态分派进行符号引用的转换时,需要去找到实际上需要使用的方法,假如没有重写那么就是调用父类的方法,所以这个判断流程就是使用虚方法表来实现的

作用

加快动态分派时候,符号引用转化为动态引用的过程

流程

1、找到动态类型,查他的虚方法表,有无目标方法

        1、有,那就是这个

        2、没有,查找他的父类

2、如此循环

理解

多态是实际上就是动态分派

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

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

相关文章

C++——二叉树

引入 map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构 二叉搜索树的特性了解,有助于更好的理解map和set的特性 1.二叉搜索树的概念及优缺点 1.1二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或…

Python中使用opencv-python进行人脸检测

Python中使用opencv-python进行人脸检测 之前写过一篇VC中使用OpenCV进行人脸检测的博客。以数字图像处理中经常使用的lena图像为例,如下图所示: 使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序,…

Backtrader 文档学习- Plotting - Plotting Date Ranges

Backtrader 文档学习- Plotting - Plotting Date Ranges 1.概述 1.9.31.x版本增加了绘制部分图形的功能。 可以使用策略实例中保留完整长度的时间戳数组的索引或者使用实际的datetime.date 或datetime.datetime 实例来限制需要绘制的内容。 仍然可以使用标准的cerebro.plot…

静态时序分析:建立时间分析

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中,建立时间检查约束了触发器时钟引脚(时钟路径)和输入数据引脚(数据路径)之间的时序关系&#x…

android中实现设备尺寸适配

1、引言 设备尺寸适配的重要性想必就不用我多说了,在我发布的历史文章中我曾谈过Qt中的设备尺寸适配问题,那这里我就来教大家如何在android中做设备尺寸适配。在android中设备尺寸适配的方式有好几种,但我喜欢的还是使用获取设备真实尺寸然后…

c语言游戏实战(4):人生重开模拟器

前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…

PLC在物联网中位置—承上启下,与上位机下位机的关联。

谈到物联网,就绕不开PLC,本文着重介绍PLC的定义、与单片机的区分,价值、物联网中的位置,以及和上位机、下位机的关联,让友友们对PLC有个全面的认知。 一、什么是PLC PLC是可编程逻辑控制器(Programmable L…

UI自动刷新大法:DataBinding数据绑定

之前我们讲了DataBinding在Activity、Fragment、RecyclerView中的基础使用,而那些常规使用方法里,每当绑定的变量发生数据变化时,都需要ViewDataBinding重新设值才会刷新对应UI。而DataBinding通过内部实现的观察者模式来进行自动刷新UI&…

go消息队列RabbitMQ - 订阅模式-direct

1.发布订阅 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下: 队列与交换机的绑定,不能…

第 384 场 LeetCode 周赛题解

A 修改矩阵 模拟 class Solution { public:vector<vector<int>> modifiedMatrix(vector<vector<int>> &matrix) {int m matrix.size(), n matrix[0].size();vector<int> mx(n, INT32_MIN);for (int i 0; i < m; i)for (int j 0; j &l…

Java微服务学习Day1

文章目录 认识微服务服务拆分及远程调用服务拆分服务远程调用提供者与消费者 Eureka注册中心介绍构建EurekaServer注册user-serviceorder-service完成服务拉取 Ribbon负载均衡介绍原理策略饥饿加载 Nacos注册中心介绍配置分级存储负载均衡环境隔离nacos注册中心原理 认识微服务…

Python : 使用python实现学生管理系统的功能,详细注释

一、学生管理系统 学生描述&#xff1a;姓名、年龄、成绩 学生管理系统功能&#xff1a;添加学生信息、删除学生信息、根据姓名修改学生信息、根据姓名查询学生信息、显示所有学生信息、退出系统 二、代码说明 1. 将每一个学生的信息放一个元组中&#xff0c;再把元组添加到列表…

单片机基础入门:简单介绍51单片机的工作原理

在电子技术领域&#xff0c;单片机是实现智能化控制不可或缺的关键元件。它们集成了许多功能于一身&#xff0c;成为了各种电子系统的心脏。为了更好地理解单片机如何工作&#xff0c;本文将重点介绍51单片机的基本组成和工作原理。 51单片机是一种广泛使用的微控制器&#xf…

【UE 求职】学了虚幻引擎可以应聘哪些岗位?

目录 1 领域1.1 游戏开发领域1.2 影视和动画制作1.3 建筑和工程可视化1.4 模拟和训练1.5 其他领域 2 如何做好一份简历1. 明确简历目标2. 突出UE5相关技能3. 展示相关项目经验4. 教育背景5. 专业经验6. 软技能7. 证书和奖项8. 定制化和校对 &#x1f64b;‍♂️ 作者&#xff1…

使用PHPStudy搭建本地web网站并实现任意浏览器公网访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

springcloud分布式架构网上商城源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

Unity Meta Quest MR 开发(四):使用 Scene API 和 Depth API 实现深度识别和环境遮挡

文章目录 &#x1f4d5;教程说明&#x1f4d5;Scene API 实现遮挡&#x1f4d5;Scene API 实现遮挡的缺点&#x1f4d5;Depth API 实现遮挡⭐导入 Depth API⭐修改环境配置⭐添加 EnvironmentDepthOcclusion 预制体⭐给物体替换遮挡 Shader⭐取消现实手部的遮挡效果 此教程相关…

Peter算法小课堂—背包问题

我们已经学过好久好久的动态规划了&#xff0c;动态规划_Peter Pan was right的博客-CSDN博客 那么&#xff0c;我用一张图片来概括一下背包问题。 大家有可能比较疑惑&#xff0c;优化决策怎么优化呢&#xff1f;答案是&#xff0c;滚动数组&#xff0c;一个神秘而简单的东西…

点云标注工具

目录 3d手势识别 c 3d关键点&#xff0c;Bounding Box Labels Rectangle Labels KITTI 3D Ground Truth Annotator c标注工具 3d手势识别 GitHub - 99xtaewoo/Automated-Hand-3D-pose-annotation-Tool: Automated Hand 3D pose annotation Tool c 3d关键点&#xff0c;Bou…

bcdedit /store 填什么,Windows11的BCD文件在哪里?

Windows11为EFI引导&#xff0c;bcd文件在 EFI分区的 \EFI\Microsoft\Boot\BCD 可以选择挂载EFI分区&#xff0c;或者使用如下方式&#xff0c;该路径可充当盘符使用。 例 bcdedit /store Z:\EFI\Microsoft\Boot\BCD /enum /v