Java只有值传递,基本类型传数值副本,引用类型传地址副本;形参重赋值不影响实参,但通过形参修改对象状态会影响实参对象内容。

Java 中只有值传递,没有引用传递——这是官方明确规定的机制。所谓“引用传递”的说法,其实是对现象的误解。关键在于:你传的是什么“值”。
基本类型一定是值传递
int、double、char、boolean 等变量本身存的就是具体数值。方法调用时,Java 复制这个数值给形参,两者内存独立。
- 修改形参,不影响原始变量
- 比如 int a = 5; 传进方法后,形参改成了 10,a 还是 5
- 因为传的是“5”这个数的副本,不是“a 这个变量”的链接
引用类型也是值传递,但传的是地址值
String、ArrayList、自定义对象等变量中存储的不是对象本身,而是堆内存中对象的地址(比如 0x7f8a12)。传参时,复制的是这个地址值。
- 形参和实参指向同一个对象 → 修改对象属性(如 obj.name = "Tom")会生效
- 但如果在方法内让形参指向新对象(如 obj = new Person()),原始变量不受影响
- 本质仍是“传地址的副本”,不是传对象本身,更不是传变量的绑定关系
一个关键判断口诀:看操作对象是谁
不看类型,看你在方法里干了什么:
立即学习“Java免费学习笔记(深入)”;
- 对形参重新赋值(=)→ 只改形参,不影响实参
- 通过形参调用方法修改对象状态(如 list.add()、sb.append())→ 实参对象内容变
- 对基本类型变量赋值 → 永远不影响外部
- 对 String 类型赋值(s = "new")→ 不改变原引用,因为 String 不可变,实际是新建对象再重指
为什么容易混淆?
因为对象内容变了,让人误以为“传了引用”。但只要记住:Java 所有传参都是拷贝一份值——基本类型拷贝数值,引用类型拷贝地址。地址被拷贝了,两个变量仍可指向同一块堆内存;但地址本身是独立的,重赋值不会波及对方。


















