会,但只在修改对象内部状态时生效;重新赋值不影响其他变量。多个引用指向同一对象时,改内容则双方可见,换引用仅当前变量变化;可用==或hashCode()判断是否同对象;需副本或不可变容器实现安全隔离。

会,但只在修改对象内部状态时生效;如果只是给变量重新赋值,则不影响另一个变量。
改对象内容 → 两个变量都看到变化
多个引用变量(比如 obj1 和 obj2)若指向堆中同一个对象,它们栈中存的是相同的内存地址。此时通过任一变量修改对象的字段或调用可变方法,都会直接操作堆中那块内存:
- obj1.name = "Tom" → obj2.name 也变成 "Tom"
- obj2.getList().add("item") → obj1.getList() 里同样多出这个 item
- 常见可变类型如 ArrayList、HashMap、StringBuilder 都适用此规则
改变量本身 → 只影响当前变量
如果在方法内让某个引用变量指向新对象,这只是替换了它栈中的地址值,其他变量仍保持原地址:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- obj1 = new Person("Alice") → obj2 仍指向原来的 Person 实例
- list = new ArrayList<>() → 原来的 list 变量不受影响
- String 类型即使写 str = str + "x",也只是新建字符串并换指针,不改变其他 String 变量的指向
怎么判断是否还是同一个对象?
运行时可通过 hashCode() 或 == 比较两个变量是否指向同一内存地址:
立即学习“Java免费学习笔记(深入)”;
- 调用前后 obj1.hashCode() == obj2.hashCode() 成立 → 仍是同一对象
- 若方法内执行了 obj1 = new Xxx(),之后该等式大概率不成立
安全隔离的常用做法
若不希望一个变量的修改波及另一个,需主动断开共享引用:
- 创建副本:new ArrayList<>(originalList) 或 originalList.clone()
- 使用不可变容器:List.copyOf(originalList)(Java 10+)
- 对基本类型封装:用 AtomicInteger、Holder<T> 等包装类间接传递

















