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,一经查实,立即删除!

相关文章

假期作业8

线程和进程服务器 线程 #include <myhead.h>#define SIP "192.168.0.114" #define SPORT 8888void *task(void *arg){printf("客户端连接\n");sleep(1);pthread_exit(NULL); }int main(int argc, const char *argv[]) {int sfd socket(AF_INET, S…

16.1 Spring框架_SpringIoC容器与Bean管理(❤❤)

16.1 Spring框架_SpringIoC容器与Bean管理 1. Spring1.1 SpringIoC1. IoC控制反转2. DI依赖注入1.2 Spring概念1. Spring含义2. 传统开发与SpringIoC开发模式比较2. IoC基础实现案例(❤❤)1. 传统方式2. IoC与DI方式3. bean管理1. xml方式(❤❤)1. bean的实例化方式

C++——二叉树

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

12.4 OpenGL顶点后处理:图元裁剪

图元裁剪 Primitive Clipping Primitive Clipping&#xff08;图元裁剪&#xff09;是图形渲染管线中的一个重要步骤&#xff0c;发生在顶点处理之后、光栅化之前。这个阶段主要目的是去除位于视体&#xff08;View Volume&#xff09;之外或者被用户自定义裁剪平面&#xff0…

【Spring和Spring Boot的区别——详细讲解】

Spring和Spring Boot的区别 1. 介绍2. Spring框架3. Spring Boot4. 结论 1. 介绍 Spring和Spring Boot都是现代Java开发中常用的技术和框架&#xff0c;它们之间的关系紧密&#xff0c;Spring Boot是建立在Spring之上的&#xff0c;它简化了Spring应用的创建和开发过程。下面是…

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

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

Backtrader 文档学习- Plotting - Plotting Date Ranges

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

TCP Server工具类,BIO阻塞和非阻塞NIO

启动自定义代码的方式 WebServer Initialized Event //Component//ApplicationContext context 注入//PostConstruct//AsyncEventListener(ApplicationReadyEvent.class)Componentpublic class TcpServerListener implements ApplicationListener<WebServerInitializedEven…

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

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

android中实现设备尺寸适配

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

MySQL基础查询篇(8)-日期和时间函数的应用

MySQL数据库是一种流行的关系型数据库管理系统&#xff0c;具有强大的日期和时间函数&#xff0c;用于对日期和时间数据进行各种操作和计算。在本篇博客中&#xff0c;我们将介绍MySQL数据库中一些常用的日期和时间函数&#xff0c;并提供详细示例说明其用法。 1. CURDATE()和…

简单介绍算法的基本概念

算法的基本概念 计算机所进行的一切操作都是由程序决定的&#xff0c;程序是由人们事先编好并输入计算机的。 一个程序包括以下两方面的内容: 对数据的描述&#xff1a;在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式&#xff0c;即数据结构 对操作的描述&a…

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

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

Transformer实战-系列教程10:SwinTransformer 源码解读3(SwinTransformerBlock类)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 SwinTransformer 算法原理 SwinTransformer 源码解读1&#xff08;项目配置/SwinTr…

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

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

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

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

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

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

第 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注册中心原理 认识微服务…

ChatGPT学习大纲

引言 在2023年2月份左右开始使用ChatGPT时&#xff0c;就被它强大的理解能力和应答效果所折服&#xff0c;这期间一直在断断续续的学习和使用&#xff0c;也没形成一个完整的学习过程&#xff0c;最近刚好有空&#xff0c;就寻思着好好再学习总结一下&#xff0c;故写出了ChatG…