java所有参数传递均为值传递,对象传递的是引用的副本;修改对象属性会影响原对象,但重新赋值引用不会改变原引用指向。

Java 中没有真正的“引用参数传递”,所有参数传递都是值传递,但对对象来说,传递的是对象引用的副本。理解这一点是关键。
对象作为参数时传递的是什么
当你把一个对象(比如 new Person())传给方法时,实际上传递的是该对象在堆内存中的地址的一个副本。这个副本和原始引用变量指向同一个对象实例。
- 方法内修改对象的属性(如 person.setName("Alice")),会影响原对象——因为操作的是同一块堆内存
- 方法内让参数引用指向新对象(如 person = new Person()),不会影响调用方的原始引用——因为只是改了副本,没动原来的引用变量
对比基本类型与对象类型的参数传递
基本类型(如 int、boolean)传递的是数值本身;而对象类型(如 String、ArrayList、自定义类)传递的是引用值(即地址)的拷贝。
- int x = 10; 传入方法后,在方法里改 x = 20;,原变量仍为 10
- Person p = new Person(); 传入方法后,在方法里执行 p.setName("Bob");,原对象名字会变
- 但若在方法中写 p = new Person();,调用方的 p 依然指向原来的对象
常见误区与验证方式
很多人误以为 Java 支持类似 C++ 的引用传递。可以通过打印对象的哈希码或使用 == 判断引用是否相同来验证:
- 在方法内外分别打印 obj.hashCode(),结果一致 → 指向同一对象
- 在方法中执行 obj = new Obj(); 后再打印 hashCode(),值变了 → 引用已重定向,不影响外部
- 不要依赖 toString() 或内容比较,要用 == 或 System.identityHashCode()
如何实现类似“修改引用本身”的效果
Java 不允许直接修改传入的引用变量本身,但有几种实用替代方案:
- 返回新对象:方法返回 Person,由调用方重新赋值,如 p = updatePerson(p);
- 使用包装容器:传入 AtomicReference
、ArrayList 或自定义 Holder 类 - 设计为 Builder 模式或链式调用,避免中途替换引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











