Java对象传参是“按值传递”,传递的是引用值的副本;形参与实参指向同一堆对象,可修改其状态,但重新赋值形参不影响实参。

Java 中对象作为方法参数时,传递的是对象引用的副本,不是对象本身,也不是引用的地址。
什么是“引用的副本”
Java 中所有对象都存储在堆内存中,变量中保存的是指向该对象的引用(可以理解为一个指针值)。当把对象传给方法时,实际上传递的是这个引用值的一份拷贝。也就是说,形参和实参各自持有一个相同的引用值,它们指向堆中同一个对象。
- 修改对象内部状态(比如 setXXX()、list.add())会影响原对象,因为操作的是同一个堆对象
- 但让形参指向新对象(如 obj = new SomeClass())不会改变实参的引用,它只改变了副本所指向的位置
常见误区:不是“引用传递”,也不是“值传递对象”
Java 官方说法是“按值传递(pass-by-value)”,只不过这个“值”对基本类型是数据本身,对对象类型是引用的值(即内存地址的拷贝)。它既不是 C++ 那种真正的引用传递(&),也不像某些语言那样能通过参数重新绑定外部变量。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- ✅ 可以通过参数修改对象内容(如 person.setName("Alice"))
- ❌ 不能通过参数让调用方的变量指向新对象(如 person = new Person() 在方法内无效)
对比基本类型帮助理解
基本类型(int、boolean 等)传参时,传递的是数值本身的副本;对象类型传参时,传递的是引用值的副本。两者本质一致,都是“值传递”,只是“值”的含义不同。
立即学习“Java免费学习笔记(深入)”;
- int a = 5; change(a); → a 不变,因为方法里改的是 a 的副本
- Person p = new Person(); changeName(p); → p.getName() 可能变了,因为方法里改的是 p 所指对象的内容
- Person p = new Person(); reassign(p); → p 仍指向原对象,reassign 方法里 p = new Person() 没有影响外部
如何真正实现“交换对象引用”
Java 无法直接通过参数交换两个引用变量的指向。如果需要这类效果,常见做法有:
- 返回新对象(如 person = updatePerson(person))
- 使用包装容器(如 AtomicReference、自定义 Holder 类)
- 将多个对象放在数组或 List 中传入,再修改其中元素

















