Java引用传参复制的是地址值而非对象本身,即栈中引用变量存储的堆内存地址被复制,形参与实参指向同一对象,故可修改属性但重赋值不影响外部。

Java 中引用类型传参时,复制的是地址值——这句话的核心意思是:你传进去的不是对象本身,也不是“引用”这个概念本身,而是那个指向对象的内存地址的一个副本。
地址值是什么
每个对象在堆内存中都有一个位置,比如 0x7f8a12b4 这样的十六进制数字。引用变量(如 User u = new User())在栈里存的,就是这个数字,而不是姓名、年龄这些数据。它就像一张纸条,上面写着“去 0x7f8a12b4 找人”,仅此而已。
复制地址值 ≠ 复制对象
当你把 u 作为参数传进方法时,JVM 并不会把整个 User 对象搬一份过去。它只是把纸条上的地址(比如 0x7f8a12b4)抄了一遍,贴到方法的局部变量上。结果是:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 原变量和形参各自独立存在栈中
- 但它们的内容(即地址)相同,所以都指向堆里同一个对象
- 通过形参修改对象属性(如
user.name = "李四"),原变量看到的也是新值
为什么重赋值不影响外部
关键就在这里:地址值是可变的普通值,能被覆盖。
立即学习“Java免费学习笔记(深入)”;
- 如果在方法里写
user = new User(),相当于把那张纸条撕了,换了一张写有新地址(比如 0x9e3c56a1)的纸条 - 原变量还拿着旧纸条,依旧指向原来的对象
- 这说明传的不是“锁死的引用”,而是一个可以自由改写的地址副本
类比帮助理解
想象你和同事共用一个共享文档链接:https://xxx/doc/123。
- 你把链接发给他,他打开后编辑内容 → 文档变了,你刷新也看到新内容(对应修改对象属性)
- 但他后来自己新建了一个文档,把浏览器地址栏改成 https://xxx/doc/456 → 你那边链接没动,还是看原来的 123(对应重新赋值)
- 你们传的不是“文档本身”,也不是“不可更改的通道”,只是那个可复制、可覆盖的链接地址

















