从JVM的角度,来分析为什么Java中是值传递?

从 JVM 的角度来看,Java 中的参数传递之所以是值传递,是因为在 JVM 执行方法调用时,参数的值(不论是基本类型还是引用类型)都被复制并压入调用栈的帧(stack frame)中。让我们从 JVM 的内存模型和调用栈的角度,详细分析为什么 Java 中是值传递。

1. JVM 的内存模型

JVM 的内存分为几个重要区域,其中与方法调用和参数传递相关的主要有:

  • 堆(Heap):用于存储对象实例。所有对象都存储在堆中,所有引用类型(如 StringList 等)变量其实是指向堆中对象的引用。
  • 栈(Stack):用于存储方法调用的局部变量和临时数据,每个线程都有一个自己的栈。当方法被调用时,JVM 会在栈中为这个方法分配一个新的栈帧(stack frame)来保存方法的参数、局部变量和一些临时数据。

2. 方法调用和栈帧

当方法被调用时,JVM 会在栈中为这个方法创建一个新的栈帧。这个栈帧包含:

  • 参数值的副本:方法的每一个参数(不管是基本类型还是引用类型)都会被复制一份,并存储在栈帧中。
  • 局部变量:方法内定义的局部变量也会存储在栈帧中。

栈帧在方法执行完毕后会被弹出栈,并释放所有数据。

3. 值传递的工作原理

当方法被调用时,JVM 会根据传入的参数创建它们的副本:

  • 基本类型参数(如 intdouble 等):直接将参数的值复制一份,并将这个值存储到栈帧中。
  • 引用类型参数(如 StringArrayList 等):传递的实际上是引用的副本。引用本身是一个指向堆中对象的地址(即对象的内存位置),这个地址值被复制并存储到栈帧中。

这意味着:

  • 基本类型:在方法内部对参数的修改只会影响副本,不会影响原始变量。
  • 引用类型:传递的是引用的副本,因此在方法内部可以通过这个副本引用操作对象本身,但如果修改引用的指向(让引用指向新的对象),不会影响原始的引用。

举例分析:基本类型的值传递

public class Test {public static void main(String[] args) {int x = 5;modify(x);System.out.println(x); // 输出:5}public static void modify(int num) {num = 10;}
}
  • modify(x) 被调用时,x 的值(即 5)被复制一份并传递给 num,此时 num 变量的值是 5
  • modify 方法中,将 num 的值改为 10,但这不会影响 main 方法中的 x,因为 num 只是 x 的副本。
  • JVM 机制:在 modify 方法的栈帧中,num 存储了 5 的副本。当方法执行完后,栈帧被销毁,num 消失,x 的值仍然是 5

举例分析:引用类型的值传递

import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("A");modify(list);System.out.println(list); // 输出:[A, B]}public static void modify(List<String> lst) {lst.add("B");}
}
  • modify(list) 被调用时,list 引用(地址)被复制一份,并传递给 lst
  • listlst 都指向堆中同一个 ArrayList 对象。
  • JVM 机制:在 modify 方法的栈帧中,lstlist 引用的副本,因此 lstlist 指向同一个对象。对 lst 的操作(如 lst.add("B"))会影响原始对象。

为什么即使是引用类型,Java 仍是值传递?

这是因为在 JVM 中,即使是引用类型,传递的仍然是引用的副本,而不是引用本身的地址引用。

  1. 引用的副本:在方法调用中,引用类型的参数传递的是引用的值,即指向对象的内存地址。这意味着方法内部的引用与外部的原始引用是不同的变量,只是它们指向同一个对象。
  2. 修改引用指向:如果在方法内部将引用重新赋值(让它指向另一个新对象),这种修改只会影响方法内部的引用,不会影响外部的原始引用。这进一步验证了 Java 是按值传递的,因为重新赋值并不影响原始对象的引用。

例如:

public class Test {public static void main(String[] args) {StringBuilder sb = new StringBuilder("Hello");modify(sb);System.out.println(sb); // 输出:Hello}public static void modify(StringBuilder sb) {sb = new StringBuilder("Goodbye"); // 重新赋值,原始对象不受影响}
}

modify 方法中,将 sb 重新赋值为一个新对象,这不会影响 main 方法中的 sb,因为 modify 方法中的 sb 只是原始引用的副本,重新赋值只影响副本。

总结

从 JVM 的角度,Java 是值传递,因为:

  1. 参数复制到栈帧:方法调用时,所有参数的值(无论是基本类型的值还是引用类型的地址)都被复制到新建的栈帧中。这些值的副本和原始值是独立的。
  2. 引用类型传递的是地址的副本:对于引用类型,传递的是指向对象的地址(引用)的副本,方法内部可以通过这个副本引用修改对象的内容,但不能改变原始引用本身。
  3. Java 中没有按引用传递:在 Java 中,不存在直接传递对象引用地址的情况,始终是传递的值的副本。

这种实现方式确保了 Java 的方法调用是“安全”的,不会因为方法内部的参数操作而直接改变调用方的变量。

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

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

相关文章

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…

三级等保安全解决方案,实施方案,整改方案(Word,PPT等相关资料学习)

信息系统进行三级等保的主要原因在于保障信息安全&#xff0c;维护国家安全和公共利益。三级等保是我国根据相关法律法规制定的信息安全等级保护制度中的一部分&#xff0c;旨在确保信息系统的完整性、可用性和保密性。通过三级等保&#xff0c;信息系统可以得到一系列的安全保…

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

老破机器硬盘要坏,转移虚拟机里的打字平台过程全记录

我有一台老破机器&#xff0c;说破其实没多破&#xff0c;但是老应该是有几年了&#xff0c;这机器一开始一直放在领导办公室不让人用&#xff0c;后来因为单位整体搬迁&#xff0c;我跟领导讨了来&#xff0c;win10的系统&#xff0c;我装了个虚拟机好像是15的版本&#xff0c…

光流法与直接法在SLAM中的应用

本文总结视觉SLAM中常用的光流法与直接法 1、Lucas-Kanade光流法 相机所拍摄到的图像随相机视角的变化而变化&#xff0c;这种变化也可以理解为图像中像素的反向移动。“光流”&#xff08;Optical Flow&#xff09;是指通过分析连续图像帧来估计场景中像素或特征点的运动的技…

VPN相关学习笔记

目录 VPN IPSec AH ESP IKE 工作流程 SSL SSL协议 握手协议 记录协议 警告协议 非对称密钥协商过程 SSL VPN工作 两种技术对比 VPN 介绍&#xff1a;VPN创建了一个专用隧道&#xff0c;用于安全地传输数据。Internet协议安全&#xff08;IPSec&#xff09;和安全套…

通过条件访问策略增强企业的安全性

在当今的数字时代&#xff0c;保护组织的数据比以往任何时候都更加重要&#xff0c;实现这一目标的一种方法是实施条件访问策略。这些策略有助于管理谁可以访问组织的网络&#xff0c;确保只有经过授权的人员才能通过&#xff0c;它们可以充当组织数据的保安&#xff0c;只让符…

二叉树搜索树(上)

二叉树搜索树&#xff08;上&#xff09; 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树: • 若它的左子树不为空&#xff0c;则左子树上所有结点的值都⼩于等于根结点的值 • 若它的右子树不为空&#xff0c;则右子树…

人群计数制作私有数据集教程-----自用

一、人群计数的数据集包括两部分&#xff1a;图像部分和标签部分 1.公开数据集格式 标签部分主要包括每个人头的坐标点&#xff1a;&#xff08;x, y&#xff09;&#xff1b; 常见的标签格式例如&#xff1a;ShanghaiTech数据集中的格式&#xff0c;用mat文件存储每个人头的坐…

SpringBoot项目快速打包成jar项目与部署

上文中,tomcat配置完成了。接下来我们需要将我们的项目打包部署至tomcat服务器。 传统的Web应用进行打包部署时,通常会打成War包的形式,然后将War包部署到Tomcat等服务器中,而SpringBoot应用使用的是嵌入式Servlet容器,也就是说,SpringBoot应用默认是以jar包形式进行打包…

【YOLOv8图像分类】YOLOv8图像分类源代码

前言 此程序是使用YOLOv8训练自己的图像并测试。Yolo系列模型可以说是比较特殊的模型&#xff0c;因为不像其他公开网络ResNet、GoogLeNet等等&#xff0c;可以自己构建和更改层。Yolo只能整体调用这个网络&#xff0c;这个可能是让初学者比较头疼的问题&#xff0c;就是看不到…

【干货】金融数据分析:风险评估中的数据分析

风险评估中的数据分析 金融风险评估因是金融行业的核心任务之一&#xff0c;也是保障金融稳定和机构可持续发展的关键。在当今数字化时代&#xff0c;数据分析已经成为金融风险评估的有力武器&#xff0c;能够帮助我们拨开复杂现象的迷雾&#xff0c;洞察风险的本质。 金融风…

【Hadoop】【hdfs】【大数据技术基础】实验三 HDFS Java API编程实践

实验三&#xff1a; HDFS Java API编程实践 实验题目 HDFS Java API编程实践 实验目的 熟悉HDFS操作常用的Java API。 实验平台 操作系统&#xff1a;Linux Hadoop版本&#xff1a;2.6.0或以上版本 JDK版本&#xff1a;1.6或以上版本 Java IDE&#xff1a;Eclipse 实验…

第R3周:RNN-心脏病预测(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f37a; 要求&#xff1a; 找到并处理第8周的程序问题&#xff08;本文给出了答案&#xff09;了解循环神经网络&#xff08…

数据结构 ——— 链式二叉树oj题:将链式二叉树的前序遍历存放在数组中

题目要求 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历 手搓一个链式二叉树 代码演示&#xff1a; // 数据类型 typedef int BTDataType;// 二叉树节点的结构 typedef struct BinaryTreeNode {BTDataType data; //每个节点的数据struct BinaryTreeNode* l…

前端中的 File 和 Blob两个对象到底有什么不同

JavaScript 在处理文件、二进制数据和数据转换时&#xff0c;提供了一系列的 API 和对象&#xff0c;比如 File、Blob、FileReader、ArrayBuffer、Base64、Object URL 和 DataURL。每个概念在不同场景中都有重要作用。下面的内容我们将会详细学习每个概念及其在实际应用中的用法…

酒店叮咚门铃的类型有哪些

在酒店的环境中&#xff0c;叮咚门铃虽小&#xff0c;却有着重要的作用&#xff0c;它是客人与酒店服务人员沟通的重要桥梁。酒店叮咚门铃主要有以下几种类型&#xff1a; 有线叮咚门铃 这是较为传统的一种类型。它通过电线连接&#xff0c;通常安装在客房的墙壁上&#xff0c;…

SFW3009 多功能移动照明系统

SFW3009 多功能移动照明系统 适用范围 广泛适用于铁路、水利、电网等抢险救援现场大范围移动照明。 结构特性 灯具体积小、重量轻&#xff0c;可以实现拖行、手提、背行三种携带方式。灯具底部也可以安装铁轨轮&#xff0c;便于用户在铁轨上作业。 灯头组件由左右两个灯头…

JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)

目录 基本使用内容 下载与安装 目录结构介绍 启动与关闭 启动 关闭 可能出现的问题及解决方案 问题一&#xff1a;启动时窗口一闪而过 问题二&#xff1a;端口号冲突 问题三&#xff1a;部署应用程序 总结 基本使用内容 Tomcat 服务器在 Java Web 开发中扮演着至关重…

w032基于web的阿博图书馆管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…