news 2026/7/2 12:38:02

Java 是值传递:深入理解参数传递机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 是值传递:深入理解参数传递机制

目录

一、什么是“值传递”与“引用传递”?

值传递(Pass-by-Value)

引用传递(Pass-by-Reference)

二、Java 的真相:一切都是值传递

关键理解:

三、代码演示:为什么说 Java 是值传递?

场景1:基本类型(int)

场景2:对象引用(List)

场景3:重新赋值引用(关键测试!)

四、图解:内存模型视角

五、常见误区澄清

误区1:“对象是引用传递”

误区2:“能修改对象内容 = 引用传递”

六、如何真正“修改”调用方的引用?

方案1:返回新对象(推荐)

方案2:使用包装类(不推荐,复杂)

方案3:操作原对象内容


“Java 中,基本类型是值传递,对象是引用传递” —— 这是一个流传甚广的误解。
事实上,Java 中所有参数传递都是值传递(Pass-by-Value),包括对象。

本文将通过原理剖析、代码示例和常见误区澄清,彻底讲清楚 Java 的参数传递机制。


一、什么是“值传递”与“引用传递”?

值传递(Pass-by-Value)

  • 调用函数时,将实参的值复制一份传给形参。
  • 函数内部对形参的任何修改,不会影响原始实参
  • C 语言中基本类型就是典型的值传递。

引用传递(Pass-by-Reference)

  • 调用函数时,直接将实参的内存地址(引用)传给形参
  • 函数内部对形参的修改,会直接影响原始实参
  • C++ 中的&引用参数就是引用传递。

注意:Java 没有引用传递!


二、Java 的真相:一切都是值传递

Java 的设计哲学非常明确:

“Java manipulates objects ‘by reference,’ but it passes references to methods ‘by value.’”
——《Thinking in Java》

翻译:

“Java 通过引用来操作对象,但向方法传递引用时,是按值传递的。”

关键理解:

  • 对象本身存储在堆内存中。
  • 变量(如List<String> list不是对象本身,而是指向对象的引用(可理解为地址)
  • 当你把list传给方法时,传递的是这个“地址”的副本,而不是地址本身。

三、代码演示:为什么说 Java 是值传递?

场景1:基本类型(int)

public static void main(String[] args) { int x = 10; changeInt(x); System.out.println(x); // 输出:10(未改变) } static void changeInt(int num) { num = 20; // 修改的是副本 }

符合值传递:副本修改不影响原值。


场景2:对象引用(List)

public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); changeList(list); System.out.println(list); // 输出:[A, B] ← 内容变了! } static void changeList(List<String> param) { param.add("B"); // 修改对象内容 }

看起来像“引用传递”?其实不是!

  • listparam都指向同一个 ArrayList 对象
  • param.add("B")修改对象的内容,不是修改引用。
  • 这属于“通过引用修改对象”,不是“引用传递”

场景3:重新赋值引用(关键测试!)

public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); reassignList(list); System.out.println(list); // 输出:[A] ← 完全没变! } static void reassignList(List<String> param) { param = new ArrayList<>(); // 让 param 指向新对象 param.add("X"); param.add("Y"); }

🔥这才是判断是否为引用传递的关键!

  • 如果是引用传递,list应该变成[X, Y]
  • 但实际输出仍是[A],说明param = ...只改变了局部变量的指向,不影响调用方

这证明了:Java 传递的是引用的值(即地址的副本),不是引用本身。


四、图解:内存模型视角


五、常见误区澄清

误区1:“对象是引用传递”

  • 错!对象本身不能被传递,传递的是指向对象的引用的副本
  • 正确说法:“Java 通过值传递引用”

误区2:“能修改对象内容 = 引用传递”

  • 错!能修改内容是因为多个引用指向同一个对象,与传递方式无关。
  • 即使是值传递,只要共享同一个对象,就能互相看到修改。

六、如何真正“修改”调用方的引用?

虽然不能通过赋值改变调用方引用,但有替代方案:

方案1:返回新对象(推荐)

List<String> newList = createNewList(); original = newList; // 显式赋值

方案2:使用包装类(不推荐,复杂)

class Ref<T> { T value; } void swap(Ref<List<String>> ref) { ref.value = new ArrayList<>(); }

方案3:操作原对象内容

list.clear(); list.addAll(newData);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 5:10:11

湖泊数据在科研与工程中的应用

湖泊作为重要的内陆水体&#xff0c;在水文循环、生态系统及区域气候中扮演关键角色。定量描述湖泊物理状态需要一系列专业参数。本文将系统介绍湖泊相关核心数据&#xff0c;并说明其在科研与工程中的实际应用。 一、湖泊核心参数概述 一套完整的湖泊物理数据集通常包含以下…

作者头像 李华
网站建设 2026/7/2 5:24:08

RDP Wrapper配置库完全使用指南:解锁Windows远程桌面全部潜能

RDP Wrapper配置库完全使用指南&#xff1a;解锁Windows远程桌面全部潜能 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini RDP Wrapper Library是一个强大的开源工具&#x…

作者头像 李华
网站建设 2026/6/28 21:13:00

官宣!TDengine 授权麦斯时代为钻石分销商,共筑工业数据新生态

当前&#xff0c;工业数字化转型进入深水区&#xff0c;时序数据作为工业设备运维、生产监控、能源管理等场景的核心数据载体&#xff0c;市场需求呈现爆发式增长。涛思数据始终坚持 “技术驱动 生态共建” 的发展战略&#xff0c;通过构建完善的分销商体系&#xff0c;让 TDe…

作者头像 李华
网站建设 2026/7/2 7:42:55

亿欧 2025 AI 软件创新产品 Top10 出炉,时序数据库TDengine 入选

当“AI 驱动增长”成为越来越多企业的共识时&#xff0c;一个新的分水岭正在出现&#xff1a;行业已经从讨论模型能力&#xff0c;转向讨论哪类 AI 软件真正能够在未来产业里稳定运行。尤其在制造、能源、化工等典型工业场景中&#xff0c;AI 要面对的不是实验条件&#xff0c;…

作者头像 李华
网站建设 2026/7/1 17:14:24

百度网盘秒传技术全解析:从零基础到效率达人的终极指南

还在为下载大文件耗费数小时而烦恼吗&#xff1f;百度网盘秒传技术正是为你量身打造的极速传输解决方案&#xff01;通过独特的文件特征值匹配机制&#xff0c;让你在几秒钟内完成原本需要数小时的下载任务&#xff0c;真正实现"秒级"传输体验。 【免费下载链接】bai…

作者头像 李华
网站建设 2026/7/2 0:34:00

OpenAI Whisper Large-V3-Turbo本地部署终极指南:从零搭建到性能调优

OpenAI Whisper Large-V3-Turbo本地部署终极指南&#xff1a;从零搭建到性能调优 【免费下载链接】whisper-large-v3-turbo 项目地址: https://ai.gitcode.com/hf_mirrors/openai/whisper-large-v3-turbo 还在为语音转写模型的高内存占用和复杂部署流程而头疼吗&#x…

作者头像 李华