Java只有值传递,因为方法内给形参重新赋值(如q = new Person())无法改变实参指向;传的是引用变量中存储的地址值(如0x1234)的拷贝,故能通过副本修改堆中同一对象,但传递机制本质仍是复制栈中值。

直接说“Java只有值传递”是对的,但容易被追问“那为什么对象属性改了原对象也变?”——关键不在结论,而在解释清楚“传的是引用的拷贝”这句实话。
先锚定一个判断标准
告诉面试官:区分值传递和引用传递,唯一可靠的方法是看「方法内给形参重新赋值,能否改变实参的指向」。
- 如果在方法里写 q = new Person(),调用后外部的 p 还是指向原来的对象 → 是值传递
- 如果那样写真能让 p 指向新对象 → 才叫引用传递(Java做不到)
用内存图讲清“引用的拷贝”是什么
不用画图,用语言还原栈和堆的关系:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- Person p = new Person("张三"):栈里存变量 p,它里面放的不是对象,而是一串地址(比如 0x1234),堆里才是真正的 Person 实例
- changeName(p):把 p 里的地址值(0x1234)复制一份,放进形参 q 的栈槽里 → q 和 p 内容相同,但位置不同
- 所以 q.setName("李四") 是拿着 0x1234 去堆里找人改名字,p 拿的也是 0x1234,自然看到一样的结果
对比基本类型,强化逻辑一致性
强调“都是值传递”,只是值的内容不同:
立即学习“Java免费学习笔记(深入)”;
- int a = 10 → 栈里 a 存的是数字 10;传参时复制出另一个 10 给形参
- Person p = ... → 栈里 p 存的是地址 0x1234;传参时复制出另一个 0x1234 给形参
- 二者本质一样:复制栈中变量的值 —— 数字是值,地址也是值
补一句常见误区的澄清
有人会说“对象是引用传递”,其实是混淆了「传递机制」和「操作效果」:
- 传递机制:一定是值传递(复制栈中内容)
- 操作效果:因为复制的是地址,所以能通过副本修改堆中同一对象 → 这不等于传递方式变了
- 就像你复印一张房产证,复印件能帮你打开同一套房的门,不代表你把原件“传”给了别人

















