java只有值传递,基本类型传数值副本,引用类型传地址副本;虽可通过地址修改对象内容,但无法改变原变量指向,故仍属值传递。

Java 中只有值传递,没有引用传递。这是语言规范层面的铁律,不是经验判断,也不是“看起来像”——无论传的是 int 还是 ArrayList,方法接收的永远是实参的副本。
基本类型:传数值副本
变量本身存的是具体值(如 10、'a'、true),调用方法时,JVM 把这个值拷贝一份给形参。两个变量在栈中完全独立,改形参不影响实参。
- 例如:
int x = 5;传入方法后,形参获得的是5的副本,哪怕改成 100,x还是 5 - 本质:栈中复制一个整数,不涉及地址或对象
引用类型:传引用地址的副本
变量中存的不是对象本身,而是堆中对象的内存地址(比如 0xabc)。方法调用时,拷贝的是这个地址值,不是对象,也不是地址本身。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 所以你能通过副本地址修改对象属性(如
user.name = "李四"),因为指向的是同一块堆内存 - 但如果你在方法内让形参指向新对象(如
u = new User("王五")),只改变了副本的指向,原变量仍指向旧对象 - 关键区分:能改“对象内容”,不能改“变量指向”
面试应答要点(简洁有力)
回答时建议三句话收住核心:
- Java 规范明确只支持值传递
- 基本类型传的是数据值的副本;引用类型传的是引用地址的副本
- 所谓“能改对象”,是因为副本地址和原地址指向同一个堆对象,并非传递机制变成了引用传递
不复杂但容易忽略:判断依据不是“能不能改内容”,而是“能不能让原变量指向别处”。只要做不到后者,就一定是值传递。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










