Java 虚方法表(虚函数)

news2024/9/21 18:46:02

虚方法表

Java 中的虚方法表(Virtual Method Table, VMT)是实现动态方法分派和多态的重要机制。它帮助 Java 运行时系统(JVM)决定在继承体系中调用哪一个方法的具体实现。

什么是虚方法表?

虚方法表是一个类的内部数据结构,用于支持方法的动态绑定(即运行时多态)。

每个类在加载时会生成一个虚方法表,其中包含了类中所有虚方法的地址。

方法地址的存储:虚方法表存储了类的所有方法(包括继承自父类的方法)的内存地址或指针。这些方法在虚方法表中的顺序与它们在类中声明的顺序一致。

动态绑定:当方法调用发生时,JVM 会根据对象的实际类型(而不是声明类型)来查找并调用正确的方法实现。这种机制允许程序在运行时决定调用哪个方法,从而实现多态。

注意:privatestaticfinal 关键字修饰过的方法不会存在虚方法表中,因为它们不能被子类访问或重写!!!

案例代码

class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}
​
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}
​
public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // 创建 Dog 对象,声明为 Animal 类型
        myAnimal.makeSound(); // 输出:Dog barks
    }
}

虚方法表的作用

支持多态:通过虚方法表,Java 支持动态方法绑定,这允许程序在运行时选择调用哪个方法实现,支持多态特性。例如,上面的例子中,myAnimal 实际上是一个 Dog 对象,因此调用 makeSound 方法时,执行的是 Dog 类中的实现。

简化方法调用:虚方法表使得方法调用的过程变得高效。通过对象的虚方法表引用,JVM 可以快速定位到正确的方法实现,而无需使用复杂的逻辑来确定方法的具体实现。

内存布局

虚方法表指针:每个对象内部都有一个指向虚方法表的指针,这个指针在对象创建时由其类的虚方法表填充。

方法表条目:虚方法表是一个数组,其中每个条目是一个方法的地址。在类加载时,这些条目会被初始化或更新。

性能考虑

开销

  • 虚方法表的使用引入了一些内存开销,因为每个类都需要维护一个虚方法表。

  • 在调用方法时,需要通过虚方法表进行查找,这可能引入一些额外的时间开销。

优化:JVM 的实现通常会进行优化,以减少虚方法调用的开销。例如,JIT 编译器可以将虚方法调用内联,以提高性能。

虚方法表与接口

接口的虚方法表:如果一个类实现了多个接口,JVM 需要维护每个接口的虚方法表,以支持接口方法的动态绑定。接口的虚方法表会合并到类的虚方法表中,以确保接口方法的正确实现。

总结

虚方法表是 Java 实现多态性和动态方法绑定的核心机制。它通过维护类中所有方法的内存地址来确保在运行时能够调用正确的方法实现。尽管虚方法表引入了一些开销,但它极大地增强了 Java 的灵活性和功能性,使得方法的调用可以在运行时动态决定,从而实现了面向对象编程中的多态性。

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

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

相关文章

Linux学习笔记(4)----通过网口灯判断网速是千兆还是百兆

网卡PHY 移植注意事项 注意RTL8211F的LED0,LED1,LED2,软件是可以自定义的,比如百兆,千兆,是亮哪个灯,黄灯或者绿灯,还有传输时是闪烁哪个灯,要注意硬件上是怎么驱动灯的…

获取当前计算机的处理器架构platform.machine()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 获取当前计算机的处理器架构 platform.machine() 选择题 关于以下代码的输出结果说法正确的是? import platform print("【执行】print(platform.machine())") prin…

Websocket测试工具,在线调试 - 在线工具

WebSocket 测试工具是用于测试 WebSocket 连接、发送和接收消息的工具。它们通常提供一个简单的用户界面,使开发人员能够快速验证 WebSocket 服务器的功能和性能。 在线Websocket测试工具体验地址:https://ewbang.com/websocket/index.html 什么是 WebSo…

具身智能(Embodied Intelligence)概述

目录 一、引言 二、具身感知 三、具身交互 四、具身智能体 五、虚拟到现实 一、引言 最近无论是斯坦福机器人炒虾,还是特斯拉官宣机器人进厂,都赚足了眼球,实力证明了具身智能(Embodied Intelligence)的火爆。…

SEO之网站结构优化(十四-内部链接及权重分配2)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 4、翻页过多 稍大型的商务…

无心剑中译莎士比亚《无君相伴浸寒冬》

莎士比亚十四行诗第98首 Sonnet 98 无君相伴浸寒冬 From you have I been absent in the spring, When proud pied April, dressed in all his trim, Hath put a spirit of youth in every thing, That heavy Saturn laughed and leapt with him. Yet nor the lays of birds,…

Python | Leetcode Python题解之第385题迷你语法分析器

题目: 题解: class Solution:def deserialize(self, s: str) -> NestedInteger:index 0def dfs() -> NestedInteger:nonlocal indexif s[index] [:index 1ni NestedInteger()while s[index] ! ]:ni.add(dfs())if s[index] ,:index 1index …

Vue3项目开发——新闻发布管理系统(四)

文章目录 七、登录&注册页面设计开发2、登录&注册页面设计3、表单校验规则设置七、登录&注册页面设计开发 2、登录&注册页面设计 登录页面如下: 点击“注册 →”,切换到注册页面: 点击“← 返回”,又可以切换回登录页面。 页面布局是这么设计的: 1…

保姆级Maven安装、配置、版本查询教程(包含配置本地仓库、阿里云私服、环境变量)

文章目录 一、Maven安装1. 下载zip包2. 解压 zip包 二、配置1. 配置本地仓库2. 配置阿里云私服3. 配置环境变量 三、Maven验证 此教程摘选自我的笔记:黑马JavaWeb开发笔记11——Maven介绍、详细安装、环境配置步骤教程,想要了解Maven组成和作用可以移步此…

中国各地区数字经济发展对环境污染的影响数据(2011-2021年)

关于中国各地区数字经济发展对环境污染的影响数据(2011-2021年),可以从以下几个方面获取相关信息: 数字经济水平:可以通过熵值法衡量的数字经济水平指标来评估各地区的数字经济发展情况。 环境污染物排放量&#xff1…

桥梁在线监测解决方案:科技赋能,守护桥梁安全

在现代社会,桥梁作为连接城市与乡村、跨越河流与峡谷的重要交通设施,其安全性和稳定性直接关系到人民生命财产的安全以及经济社会的正常运转。然而,桥梁在长期使用过程中,会受到自然环境、车辆荷载、材料老化等多种因素的影响&…

中国各地区-城市创新和产业创新指数(2001-2021年)

数据及指标 年份、行业代码、行业名称、大类行业、产业创新指数、城市代码、城市、省份、城市创新指数。 2001-2021年 中国各地区-城市创新和产业创新指数https://download.csdn.net/download/2401_84585615/89504735 中国各地区在城市创新和产业创新指数方面有显著的发展和…

制作效果图常用的软件和渲染器介绍

我们用于效果图制作与渲染的软件主要有3ds Max、Sketchup、Rhino、V-Ray、Corona、Enscape、Lumion和D5 渲染器等。用于制作效果图的软件很多,作为初学者,我们没必要都学习,只需选择一个设计软件和一个渲染器学习就可以了,等都彻底…

设计模式-UML建模语言面向对象的SOLIDLC

一、设计模式概述和UML 1.设计模式概述 1.序言 把软件开发当做修炼武功的话,那么可以分为招式和内功心法。 招式:C,C, java, python等编程语言;jsp等开发技术,qt, spring等开发框架。这些是…

使用.gitignore文件忽略文件

一 .gitignore文件的作用 有些情况,你需要把一些文件放到Git工作目录中,但无需提交,比如本地配置,自动生成的文件等。.gitignore文件可以帮助你实现这样的需要。 二 .gitignore文件的创建和编辑 在git根目录或任意子目录创建名…

springbootmybatis中数组和字符串数据类型的转换

需求 前端(VUE)页面上有一个可多选的select控件,前端以数组形式存储被选中的数据,但是数据库中不想新建表来存储,希望在主表中用以逗号为分隔符的字符串来存。 于是在存储和读取数据的时候就涉及到数据类型转换的问题…

现在别买MPV,比亚迪“夏”来搅局了

文 | AUTO芯球 作者 | 雷慢 买MPV的今年千万别出手, MPV市场可能要变天了。 来,看这个,比亚迪刚刚在成都车展上发布了第一款MPV“夏”, 标准的中大型尺寸, 长5145mm,宽1970mm,高1805mm 主…

学院个人信息|基于SprinBoot+vue的学院个人信息管理系统(源码+数据库+文档)

学院个人信息管理系统基于SprinBootvue的学院个人信息管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 学生模块实现 教师模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

『功能项目』技能爆炸与伤害数值显示【13】

我们打开上一篇12怪物受击后显示受击状态UI的项目, 本章要做的事情是显示魔法球碰撞到怪物时产生的技能爆炸特效 与 显示伤害数值的功能 首先打开资源商店下载一个免费的技能特效 我们双击red技能效果预制体 我们要做的是当怪物受击时,生成这个red预制体…

公务员面试(c语言)

1./ 描述 //公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。 //(注:本题有多组输入) //输入…