重载和重写在JVM中如何实现的?

简介: 重载和重写在JVM中如何实现的?

正文


Java的三大特性,即封装、继承、多态。最能体现重载和重新的特征是在三大特性中的多态体现的。而在多态的实现的过程中,分派的调用过程是Java多态的特征的一些基本的体现。下面简单的说明一下什么是静态分派和动态分派。


静态分派:所有依赖静态类型来决定执行版本的分派为静态分派。

下面看一个例子:


10.png执行的结果如下:

14.png

Human man = new Man(); 这行代码中Human称为变量的静态类型,

或者是外观类型。

后面的Man类型称为实际类型或者叫做运行时类型。

静态类型和实际类型在程序中都有可能发生变化。区别是静态类型的变化仅仅发生在使用的时候,变量自身的静态类型是不会发生变化的,并且最终的静态类型是在编译期间是可以知道的。而实际类型是在运行期间才能确定,编译器在编译期间是不知道一个对象的类型是什么的。而静态分派就是根据静态类型来执行的,静态分派最典型的代表就是方法重载。

静态分派发生在编译阶段,因此静态分派动作实际上不是由虚拟机来执行的。


动态分派:它是Java语言多态性的另一种体现--方法重写

13.png

运行结果如下:

12.png

从上面运行的结果可以看出,调用方法的选择不可能再根据静态类型来决定的,因为静态类型同样都是Human的类型。导致运行结果不一样是因为实际类型的不同,那么JVM是通过什么样的方式通过实际类型找到执行版本的呢?我们下面的图片:

11.png


可以看到,实际上采用的是invokevirtual字节码命令来实现的,而invokevirtual这个命令是在运行期间确定接收者的实际类型,所以两次调用的结果是不同的。也就是说重写的本质是:在运行期间,JVM采用invokevirtual的命令确定接受者的实际类型,而在解析常量池中到方法引用后,还要根据接受者的实际类型选择方法的版本。

把这种在运行期间根据实际类型确定执行方法的版本的分派过程称为动态分派。



单分派和多分派:静态分派属于多分派类型,而动态分派属于单分派。所以java语言是静态多分派,动态单分派的语言。

重载是静态多分派实现的,重写是动态单分派实现的。

相关文章
|
算法 Java 开发者
G1垃圾回收器的停顿时间预测模型是如何工作的?
G1垃圾回收器的停顿时间预测模型是如何工作的?
796 5
|
存储 前端开发 Java
Spring Boot之文件上传:实现简单易用的文件上传功能
本篇详细介绍了在Spring Boot应用中实现文件上传功能的步骤。从创建前端页面、编写Controller处理、文件存储与访问、添加路由与页面展示等方面进行了详细讲解,并提供了代码示例。通过学习本文,读者可以轻松了解如何在Spring Boot项目中实现简单易用的文件上传功能,从而在实际应用中更好地满足用户需求。
5181 0
Spring Boot之文件上传:实现简单易用的文件上传功能
|
关系型数据库 MySQL Java
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
|
存储 Java Unix
什么是线程?为什么需要线程?和进程的区别?
什么是线程?为什么需要线程?和进程的区别?
5401 0
|
存储 JSON 安全
深入理解与实践:Token的使用及其在Web应用安全中的重要性
【7月更文挑战第3天】在现代Web应用程序中,Token作为一种关键的安全机制,扮演着维护用户会话安全、验证用户身份的重要角色。本文将深入探讨Token的基本概念、类型、工作原理,并通过实际代码示例展示如何在Web应用中实现Token的生成、验证及应用,以确保数据传输的安全性和用户认证的有效性。
4458 2
|
设计模式 安全 索引
【DS】详解ArrayList及其扩容机制
【DS】详解ArrayList及其扩容机制
709 0
【DS】详解ArrayList及其扩容机制
|
算法 关系型数据库 中间件
分库分表的几种常见形式
垂直分表:垂直分表在日常开发和设计中比较常见,通俗的说法叫做“大表拆小表”,拆分是基于关系型数据库中的“列”(字段)进行的。通常情况,某个表中的字段比较多,可以新建立一张“扩展表”,将不经常使用或者长度较大的字段拆分出去放到“扩展表”中。
2067 0
|
存储 JavaScript 前端开发
Vue中组件通信方式有哪些?
本文介绍了 Vue 中几种常见的组件间通信方式,包括 Props / $emit、provide / inject、ref / refs、eventBus、Vuex、$parent / $children、$attrs / $listeners 以及通过 vue-router 传参。每种方式都有其适用场景和注意事项,帮助开发者根据具体需求选择合适的通信方式。
397 3
Vue中组件通信方式有哪些?
|
JavaScript
Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘
Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘
1323 1
|
存储 NoSQL MongoDB
MongoDB的优势是什么
MongoDB的优势是什么
1295 5

热门文章

最新文章