深入理解Java引用传递

先看一段代码:

    public static void add(String a) {
        a = "new";
        System.out.println("add: " + a); // 输出内容:add: new
    }

    public static void main(String[] args) {
        String a = null;
        add(a);
        System.out.println("main: " + a); // 输出内容:main: null
    }

我们知道一个基本的概念:在java中基本类型是按值传递,而引用类型是地址传递。基于这个概念那么main方法中的a最后应该输出‘new’才对呀,为什么还是:‘null’呢?要理解这个问题,我们引入一个概念,在进行方法调用的时候,形参a和实参a的地址其实是不一样的,发生了一次地址copy。

add方法调用前的堆栈状态如图所示:
add方法调用前的堆栈状态
执行完add方法后的堆栈状态,如图所示:
执行完add方法后的堆栈状态
可以看出来,进行方法调用的时候形参a和实参a的地址发生了一次地址复制,一开始都是指向null,但是add方法执行完后,其中add方法中参数a地址重新指向了字符串“new”,并没有改变main方法中参数a的指向,因此,不论add方法调用多少次,main方法中参数a的值都没有发生变化。

为什么方法调用会进行一次地址复制呢?

方法调用的本质其实就是一次入栈,调用结束后进行出栈操作。入栈就是要保护当前上下文环境,出栈就是要恢复到调用方法前的状态。为了保护上下文环境就导致必须对参数进行一次复制,对于基本类型是值复制,对于引用类型就是地址值的复制。如果还是拿着之前的参数进行操作就没法恢复上下文环境了。

结论

Java对于引用类型的参数虽然是引用传递,但是要注意,方法调用会导致实参和形参的地址值发生一次复制,从而导致对形参进行new赋值时,导致形参和实参指向不一致,导致潜在的问题。

建议

尽量不要对方法参数进行new重新赋值操作,从而导致潜在的问题。如果非要这么做,请先弄清楚这样做后的后果,从而避免潜在的bug。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

langchain教程-7.Embedding/文本向量化

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…

Mac下使用brew安装go 以及遇到的问题

首先按照网上找到的命令进行安装 brew install go 打开终端输入go version,查看安装的go版本 go version 配置环境变量 查看go的环境变量配置: go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录,在该目录中新建…

Ubuntu部署Deepseek-R1模型(8b)

安装ubuntu系统 本机电脑系统ubuntu-20.04 #升级软件 sudo apt-get update#安装curl sudo apt-get install curl通过以上两条指令,完成了curl命令的安装。 安装ollama 打开Ollama官网 选择Linux, 给出如上图方框所示的一条指令 curl -fsSL https:…

【ROS视频推流】使用web_video_server完成视频推流

🚀 本文简要介绍一下使用web_video_server功能包完成实时视频推流的方法。 假设有A,B两个设备,它们之间可以ping通。我们需要将A设备上的实时摄像头图像推流并在B设备的浏览器上显示。 🌔01准备工作 # A设备 # 下载视频推流功能包 #&#xff…

[LVGL] 在VC_MFC中移植LVGL

前言: 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码,并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库,提供您创建具有易于使用的图形元素、漂亮…

Java----线程池

什么是线程池呢,先举一个情景: 一个火锅店开业了,早上人比较少,大家进店后不需要预约,直接付款在店里的桌子上吃饭,慢慢的人多了,店里的桌子不够用了,没座位的人可以先预约&#xf…

安卓开发,底部导航栏

1、创建导航栏图标 使用系统自带的矢量图库文件,鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖,并点击Sync Now …

每日Attention学习22——Inverted Residual RWKV

模块出处 [arXiv 25] [link] [code] RWKV-UNet: Improving UNet with Long-Range Cooperation for Effective Medical Image Segmentation 模块名称 Inverted Residual RWKV (IR-RWKV) 模块作用 用于vision的RWKV结构 模块结构 模块代码 注:cpp扩展请参考作者原…

Git--使用教程

Git的框架讲解 Git 是一个分布式版本控制系统,其架构设计旨在高效地管理代码版本,支持分布式协作,并确保数据的完整性和安全性。 Git 的核心组件: 工作区(Working Directory): 工作区是你在本…

智慧停车系统:不同规模停车场的应用差异与YunCitys解决方案

在智慧停车领域,不同规模停车场因自身特点,对智慧停车系统的需求和应用效果存在显著差异。云创智城凭借丰富的经验和先进的技术,为各类规模停车场打造了贴合需求的智慧停车系统,下面为您详细剖析。 小型停车场:精准高…

snort的学习记录

一、what is snort?什么是snort? Snort 是一款开源的 网络入侵检测系统(NIDS) 和 网络入侵防御系统(NIPS),能够实时监控网络流量,检测恶意行为(如端口扫描、SQL注入、DDoS攻击等&a…

PHP-trim

[题目信息]: 题目名称题目难度PHP-trim1 [题目考点]: trim() 函数移除字符串两侧的空白字符或其他预定义字符。[Flag格式]: SangFor{dl9hFiITmhQNAJysCgigAskyCZ6kQaDc}[环境部署]: docker-compose.yml文件或者docker tar原始文件。 ht…

maven如何不把依赖的jar打包到同一个jar?

spring boot项目打jar包部署: 经过以下步骤, 最终会形成maven依赖的多个jar(包括lib下添加的)、 我们编写的程序代码打成一个jar,将程序jar与 依赖jar分开,便于管理: success: 最终…

【ArcGIS Pro 简介1】

ArcGIS Pro 是由 Esri (Environmental Systems Research Institute)公司开发的下一代桌面地理信息系统(GIS)软件,是传统 ArcMap 的现代化替代产品。它结合了强大的空间分析能力、直观的用户界面和先进的三维可视化技术…

DeepSeek 部署过程中的问题

文章目录 DeepSeek 部署过程中的问题一、部署扩展:docker 部署 DS1.1 部署1.2 可视化 二、问题三、GPU 设置3.1 ollama GPU 的支持情况3.2 更新 GPU 驱动3.3 安装 cuda3.4 下载 cuDNN3.5 配置环境变量 四、测试 DeepSeek 部署过程中的问题 Windows 中 利用 ollama 来…

Elasticsearch基本使用详解

文章目录 Elasticsearch基本使用详解一、引言二、环境搭建1、安装 Elasticsearch2、安装 Kibana(可选) 三、索引操作1、创建索引2、查看索引3、删除索引 四、数据操作1、插入数据2、查询数据(1)简单查询(2)…

点(线)集最小包围外轮廓效果赏析

“ 图像、点集、线集合最小外轮廓计算应用较为广泛,如抠图、神奇选择、LOD、碰撞检查等领域,提高场景效率” 1.前言 作者基于递归迭代求解实现点集的最小外轮廓计算,在CGLib库中实现,已集成于CGViewer,可联系作者试用&…

IOPS与吞吐量、读写块大小及延迟之间的关系

IOPS(每秒输入/输出操作次数)、吞吐量、读写块大小及延迟是衡量存储系统性能的四个关键指标,它们之间存在密切的关系。以下从多个方面详细说明这些指标之间的关系: 1. IOPS与吞吐量的关系 公式关系:吞吐量&#xff0…

FPGA与ASIC:到底选哪个好?

不少人想转行FPGA,但在ASIC和FPGA之间犹豫不决。要做出选择,首先需要清楚两者的区别和各自特点。 FPGA (Field Programmable Gate Array) 是一种现场可编程门阵列芯片,本质上它是一种半定制的芯片,可以根据需要重新编程&#xff…

LLMs之data:synthetic-data-generator的简介、安装和使用方法、案例应用之详细攻略

LLMs之data:synthetic-data-generator的简介、安装和使用方法、案例应用之详细攻略 目录 synthetic-data-generator的简介 1、核心功能和优势 2、特点 synthetic-data-generator的安装和使用方法 1、安装 pip安装 安装依赖项 运行应用 2、使用方法 快速入…