赋值操作复制的是引用而非对象本身,因此修改对象内部状态会影响所有引用该对象的变量,但重新赋值变量只改变其指向,不影响其他变量。

会受影响,但只限于修改对象内部的属性或可变状态,而不是替换整个引用。
赋值本质是复制引用,不是复制对象
Java中对象变量存储的是堆内存中的地址。当你写 Person newPerson = oldPerson;,newPerson 和 oldPerson 指向同一个对象实例。它们共享同一块内存空间。
- 修改字段(如
newPerson.name = "Tom";)→ oldPerson.name 同步变成 "Tom" - 调用方法改变内部状态(如
list.add("item");)→ 原 list 内容同步变化 - 但让 newPerson 指向新对象(如
newPerson = new Person();)→ oldPerson 不受影响,仍指向原对象
List 类型尤其容易踩坑
如果对象有个 List 属性,你写:
List<string> temp = obj.items;</string>
temp 和 obj.items 是同一个 ArrayList 实例。后续执行:
-
temp.add("x");→ obj.items 里也多了一个 "x" -
temp.clear();→ obj.items 变空 -
temp = new ArrayList();→ 这只是让 temp 指向新列表,obj.items 不变
想互不影响?必须创建独立副本
要让新变量和原对象彻底隔离,不能靠简单赋值,得显式拷贝:
- 对 List:用
new ArrayList(obj.items)或List.copyOf(obj.items)(Java 10+) - 对自定义对象:提供拷贝构造函数(如
new Person(old))或实现深拷贝逻辑 - 避免直接暴露可变集合:把
private List改为items; private final List,并只通过 getter 返回items = new ArrayList(); new ArrayList(items)或items.unmodifiableList()
区分“改内容”和“换引用”
关键看操作作用在哪一层:
- 修改对象字段、调用 setter、调用 add/remove/clear 等 → 影响所有引用该对象的变量
- 给变量重新赋值(
obj = null;或obj = new Person();)→ 只改变当前变量的指向,不影响其他变量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











