Java虚拟机 -方法调用

方法调用

  • 方法调用
    • 静态链接
    • 动态链接
    • 案例
    • 虚方法与非虚方法
      • 虚方法(Virtual Method)
      • 非虚方法(Non-Virtual Method)
    • 方法返回地址

方法调用

我们编写Java程序的时候,我们自己写的类通常不仅仅是调用自己本类的方法。调用别的类的方法的时候,从字节码的角度,我们调用别的类的方法,字节码里面存储的是别的类的符号引用。
在这里插入图片描述
但是JVM运行的时候,我们需要一个机制去把这个符号,转化成实际的引用的类方法的地址,这样我们运行的时候,才能够找到要调用的方法。
在JVM中,将符号引用转化为调用方法的直接引用与方法的绑定机制有关,方法的绑定机制有两种:

  1. 静态绑定
  2. 动态绑定

静态链接

Java源代码转化成字节码文件装载到JVM区域的时候,如果被调用的类的目标方法,编译期间就可以确定下来的话,而且运行期间不会变。这时候,我们可以将调用方法的符号引用直接转化成目标方法的直接引用,这种情况就是静态链接或者早期绑定。

动态链接

被调用的方法如果编译期间无法确定下来,这种情况,程序只能够在运行期间将调用方法的符号引用转化成直接引用,这种情况就叫动态链接或者晚期绑定。

案例

class Student{public void study() {System.out.println("begin study");}
}interface Play{public void play();
}class JuniorStudent extends Student implements Play{@Overridepublic void play() {System.out.println("JuniorStudent play");}
}class MiddleStudent extends Student implements Play{@Overridepublic void play() {System.out.println("MiddleStudent play");}
}public class LinkTest {public void play(Play play) {play.play();}public void study(Student student) {student.study();}
}

虚方法与非虚方法

JVM的实现机制

  1. 虚方法调用
    JVM使用虚方法表(vtable)实现动态分派。每个类维护一个虚方法表,记录方法的实际入口地址。调用时根据对象的实际类型查表,找到正确的方法实现。
  2. 非虚方法调用
    直接通过符号引用在编译期确定调用目标,无需运行时查找。

虚方法(Virtual Method)

虚方法是支持动态绑定(运行时绑定)的方法,具体调用的方法实现由对象的实际类型(运行时类型)决定。Java中,默认情况下,未被final、private或static修饰的实例方法都是虚方法。

特点

  • 动态绑定:方法调用在运行时根据对象的实际类型确定。

  • 支持多态:允许子类重写(Override)父类方法,实现多态。

  • 虚方法表(vtable):JVM通过虚方法表快速查找方法的实际实现。

class Animal {public void speak() { // 虚方法(可被重写)System.out.println("Animal speaks");}
}class Dog extends Animal {@Overridepublic void speak() { // 重写父类方法System.out.println("Dog barks");}
}public class Test {public static void main(String[] args) {Animal animal = new Dog();animal.speak(); // 输出 "Dog barks"(动态绑定到Dog的speak方法)}
}

常见虚方法

  • 普通实例方法(未被final、private、static修饰)。

  • 接口的默认方法(default方法)。

  • 抽象方法(abstract方法)。

非虚方法(Non-Virtual Method)

非虚方法是静态绑定(编译时绑定)的方法,调用的具体方法在编译期就能确定,与对象的实际类型无关。这些方法无法被重写,或不需要动态分派。

特点

  • 静态绑定:方法调用在编译时确定。

  • 无法被重写:子类无法修改其行为。

  • 性能更高:无需运行时查找方法表。

class Parent {public static void staticMethod() { // 非虚方法(静态方法)System.out.println("Parent's static method");}private void privateMethod() { // 非虚方法(private方法)System.out.println("Parent's private method");}public final void finalMethod() { // 非虚方法(final方法)System.out.println("Parent's final method");}
}class Child extends Parent {// 尝试重写静态方法(实际是隐藏,而非重写)public static void staticMethod() {System.out.println("Child's static method");}// 无法重写private方法和final方法
}public class Test {public static void main(String[] args) {Parent parent = new Child();parent.staticMethod(); // 输出 "Parent's static method"(静态绑定)}
}

常见的非虚方法

  • 静态方法(static):属于类,调用时基于引用类型。

  • 私有方法(private):仅在类内部可见,无法被重写。

  • final方法:禁止子类重写。

  • 构造方法:隐式调用,无法被动态分派。

  • 通过super调用的父类方法:直接指定父类实现。

方法返回地址

当一个方法开始执行之后,只有两种可能:

  1. 正常结束,当前方法栈帧出栈, 返回上一个方法的栈帧;
  2. 异常结束,如果本方法没有处理异常的方法,方法就会异常退出,不会给调用者提供任何返回值

无论是怎样退出,在方法退出之后,都需要恢复到被调用之前的那个方法的栈帧的当时的状态,程序才能正常往下执行。从栈的角度,方法退出,实际上是当前栈帧出栈,要恢复上层方法的局部变量表与操作数栈,如果有返回值,还需要把返回值压入操作数栈,然后将程序计数器指向上层方法的下一条指令的地址。

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

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

相关文章

【 开源:跨平台网络数据传输的万能工具libcurl】

在当今这个互联互通的世界中,数据在各种设备和平台之间自由流动,而 libcurl,就像一把跨平台的万能工具,为开发者提供了处理各种网络数据传输任务所需的强大功能。它不仅是一个库,更是一种通用的解决方案,可…

ElasticSearch 8.x 快速上手并了解核心概念

目录 核心概念概念总结 常见操作索引的常见操作常见的数据类型指定索引库字段类型mapping查看索引库的字段类型最高频使用的数据类型 核心概念 在新版Elasticsearch中,文档document就是一行记录(json),而这些记录存在于索引库(index)中, 索引名称必须是…

优化 CRM 架构,解锁企业竞争力密码

引言 “在所有企业面临的挑战中,客户关系管理无疑是最为关键的一环。” —— 彼得德鲁克 在数字化浪潮席卷的当下,企业面临着前所未有的机遇与挑战。客户关系管理(CRM)作为企业运营的核心环节,其架构的优劣直接影响着…

深入理解Docker和K8S

深入理解Docker和K8S Docker 是大型架构的必备技能,也是云原生核心。Docker 容器化作为一种轻量级的虚拟化技术,其核心思想:将应用程序及其所有依赖项打包在一起,形成一个可移植的单元。 容器的本质是进程: 容器是在…

list.forEach(s -> countService.refreshArticleStatisticInfo(s.getId())); 讲解一下语法

这段代码使用了Java中的forEach方法结合Lambda表达式来遍历一个列表,并对列表中的每个元素执行特定操作。具体来说,它会遍历列表中的每一个元素,并调用countService.refreshArticleStatisticInfo(s.getId())方法来刷新每个文章的统计信息。下…

AI开发者的算力革命:GpuGeek平台全景实战指南(大模型训练/推理/微调全解析)

目录 背景一、AI工业化时代的算力困局与破局之道1.1 中小企业AI落地的三大障碍1.2 GpuGeek的破局创新1.3 核心价值 二、GpuGeek技术全景剖析2.1 核心架构设计 三、核心优势详解‌3.1 优势1:工业级显卡舰队‌‌‌3.2 优势2:开箱即用生态‌3.2.1 预置镜像库…

05算法学习_59. 螺旋矩阵 II

05算法学习_59. 螺旋矩阵 II 05算法学习_59. 螺旋矩阵 II题目描述:个人代码:学习思路:第一种写法:题解关键点: 个人学习时疑惑点解答: 05算法学习_59. 螺旋矩阵 II 力扣题目链接: 59. 螺旋矩阵 II 题目描…

JDK7Hashmap的头插法造成的环问题

单线程下的扩容 多线程下的扩容 next=e 然后e的next变成e

JAVA|后端编码规范

目录 零、引言 一、基础 二、集合 三、并发 四、日志 五、安全 零、引言 规范等级: 【强制】:强制遵守,来源于线上历史故障,将通过工具进行检查。【推荐】:推荐遵守,来源于日常代码审查、开发人员反馈…

2025-05-21 Python深度学习5——数据读取

文章目录 1 数据准备2 Dataset2.1 自定义 Dataset2.2 使用示例 3 TensorBoard3.1 安装3.2 标量可视化(Scalars)3.3 图像可视化(Images)3.4 其他常用功能 4 transform4.1 ToTensor()4.2 Normalize()4.3 Resize()4.4 Compose()4.5 C…

5月21日学习笔记

MYSQL三层结构 表1 数据库DB1 表2 数据库管理系统 客户端命令终端(Dos) DBMS 数据库DB2 表1 表2 数据库………. Mysql数据库-表的本质仍然是文件 表的一行称之为一条记录->在java程序中一行记录往往使用对象表示 SQL语…

二十、面向对象底层逻辑-ServiceRegistry接口设计集成注册中心

一、服务治理的基石接口 在微服务架构中,服务实例的动态注册与发现是保证系统弹性的关键机制。Spring Cloud Commons模块通过ServiceRegistry与Registration接口定义了服务注册的标准化模型,为不同服务发现组件(Eureka、Consul、Nacos等&…

DeepSeek:以开源之力,引领AI技术新风潮

在年春节,大语言模型DeepSeek如同一枚震撼弹,在全球范围内引发了轰动,成功“破圈”,将中国的人工智能(AI)技术成果推向了世界舞台。 开源策略:打破技术壁垒 在AI行业,OpenAI等巨头…

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象,最近开发了一种优化算法——雾状优化算法(RIME)。它模拟硬雾状和软雾状过程,构建硬雾状穿刺和软雾状搜索机制。在本研究中,引入了一种增强版本,称为修改的RIME…

PyTorch可视化工具——使用Visdom进行深度学习可视化

文章目录 前置环境Visdom安装并启动VisdomVisdom图形APIVisdom静态更新API详解通用参数说明使用示例Visdom动态更新API详解1. 使用updateappend参数2. ~~使用vis.updateTrace方法~~3. 完整训练监控示例 Visdom可视化操作散点图plot.scatter()散点图案例线性图vis.line()vis.lin…

Java使用Collections集合工具类

1、Collections 集合工具类 Java 中的 Collections 是一个非常有用的工具类,它提供了许多静态方法来操作或返回集合。这个类位于 java.util 包中,主要包含对集合进行操作的方法,比如排序、搜索、线程安全化等。 Java集合工具类的使用&#x…

Unity基础学习(五)Mono中的重要内容(1)延时函数

目录 一、Mono中的延时函数Invoke 1. Invoke作用:延迟指定时间后执行一次函数。API: 2. InvokeRepeating作用:延迟后开始重复执行函数。API: 3. CancelInvoke作用:停止所有延时函数,或停止指定函数的延时…

180KHz 60V 5A开关电流升压/升降压型DC-DC转换器XL4019升降压芯片

介绍 XL6019是一款专为升压、升降压设计的 单片集成电路(升压和降压是由外围电路拓扑确定的),可工作在DC5V到40V输入电 压范围,低纹波,内置功率MOS。XL6019内 置固定频率振荡器与频率补偿电路,简化了电 路…

如何畅通需求收集渠道,获取用户反馈?

要畅通需求收集渠道、有效获取用户反馈,核心在于多样化反馈入口、闭环反馈机制、用户分层管理、反馈数据结构化分析等四个方面。其中,多样化反馈入口至关重要,不同用户有不同的沟通偏好,只有覆盖多个反馈路径,才能捕捉…

Python结合ollama和stramlit开发聊天机器人

Python结合ollama和stramlit开发聊天机器人 一、环境准备1、streamlit安装2、langchain安装3、ollama的安装 二、Ollama平台聊天机器人实现1、需求2、模型调用3、前端实现页面呈现代码实现 三、详细代码地址四、参考资源 一、环境准备 1、streamlit安装 # 通过 pip 安装 pip …