java中方法参数传递对象时传递的是引用副本,可修改对象属性但不能改变外部变量的引用指向;所有参数均为值传递,基本类型传值,对象类型传引用值。

Java中方法参数传递对象时,实际传递的是对象的引用副本。这意味着方法内部可以修改该引用所指向对象的属性,但无法让外部变量指向新对象。
对象属性修改是有效的
当传入一个对象(如StringBuffer、ArrayList或自定义类实例)时,方法内通过引用访问并修改其字段或调用其setter方法,这些修改会反映在原对象上。
- 引用本身是按值传递的,但这个“值”是内存地址的拷贝,两个引用指向同一块堆内存
- 只要不重新赋值参数变量(如 obj = new MyClass()),对 obj.field 或 obj.setXXX() 的操作都会影响原始对象
- 常见可变类如 StringBuilder、ArrayList、HashMap 都支持这种修改
不能改变外部变量的引用指向
如果在方法内给参数重新赋值,比如创建新对象并赋给形参,这不会影响调用方的原始变量。
- obj = new Person("new"); 只改变了形参 obj 的指向,原变量仍指向旧对象
- 类似地,str = "abc"; 对 String 类型无效,因为 String 不可变且重新赋值只是换引用
- 若需“替换”对象,应返回新对象并在调用处重新赋值
典型示例:修改对象属性
假设有一个 Person 类:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
以下方法能成功修改原始对象:
void updatePerson(Person p) { p.name = "Alice"; p.age = 30; // ✅ 修改生效 }而这样写则无效:
void replacePerson(Person p) { p = new Person("Bob", 25); // ❌ 外部引用不变 }区分基本类型与对象参数行为
基本类型(int、boolean等)传递的是值本身,修改不影响外部;对象类型传递的是引用的值(即地址),修改其内容会影响外部,但重赋值不影响。
- 统一理解:Java 所有参数都是“值传递”,对象也不例外,只是这个“值”是引用
- 关键看操作目标:改 引用指向的内容 → 生效;改 引用本身 → 不生效
- 不可变类(如String、LocalDateTime)即使传入对象,也无法修改其内部状态,只能返回新实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










