Java只有值传递,基本类型传递数值副本,引用类型传递对象地址的副本;因此可修改对象内容但不能改变原变量指向。

Java 中所有参数都是值传递,这点必须牢牢记住。所谓“值传递”,不是指传的是“简单数值”,而是指:实参把自己的值完整复制一份给形参,之后两者完全独立。关键在于——这个“值”到底是什么?基本类型是数据本身,引用类型是对象地址。掌握这个底层逻辑,就能应对绝大多数面试题。
一、先分清“改内容”和“换指向”
这是面试最常考的判断依据,也是最容易混淆的点:
- ✅ 修改对象内部状态(如 arr[0] = 1、obj.name = "Tom"、list.add("x"))→ 实参可见,因为操作的是堆中同一块内存
- ❌ 重新赋值引用变量(如 arr = new int[5]、obj = new Person()、list = new ArrayList())→ 实参不变,因为只是让形参变量指向新地址,原变量地址未动
二、用生活类比快速建立直觉
把对象想象成一栋房子,引用变量就是一把钥匙:
- 你把钥匙复制一把交给别人(值传递),他拿这把复制钥匙进门装修(改属性)→ 房子真变了
- 但他若自己配了一把新钥匙(obj = new ...),再把旧钥匙扔了 → 你的那把原钥匙还在,照样能开门
- Java 永远不交出你的原钥匙,只给复制品
三、重点盯紧三类高频陷阱类型
String、数组、包装类 是面试最爱挖坑的地方:
立即学习“Java免费学习笔记(深入)”;
- String:不可变对象。str = "new" 是换引用;str.concat() 返回新对象,原 str 不变
- 数组:本质是对象。可改 arr[i],但 arr = newArr 无效;二维数组同理,matrix[0] = row 有效(改外层数组元素),matrix = new ... 无效
- 包装类(Integer、Boolean等):也是对象。i = i + 1 触发自动拆箱/装箱+新对象创建,原引用不变
四、面试答题结构建议
遇到“Java 是值传递还是引用传递”这类问题,按三句话回应:
- Java 只有值传递,这是语言规范明确规定的
- 基本类型传的是数值副本;引用类型传的是地址值的副本(不是对象本身,也不是引用本身)
- 所以能修改对象内容,但不能改变实参变量所指向的地址——这正是值传递的本质特征


















