Java方法传参只有值传递:基本类型传数值副本,修改不影响实参;引用类型传地址副本,修改对象内容会影响实参,但重赋值指向新对象则不影响。

Java里方法传参只有值传递,但“值”的含义因类型而异:基本类型传的是数据本身,引用类型传的是对象地址——这直接决定了方法内修改能否影响外部变量。
基本类型传参:改形参不影响实参
int、double、char、boolean等8种基本类型,变量直接存数值,传参时复制一份值给形参。形参和实参内存独立,互不干扰。
- 比如传一个 int a = 5,方法里把形参改成 100,外面的 a 还是 5
- 本质是栈中两个独立变量,就像复印身份证,涂改复印件不影响原件
- 所有赋值、运算、甚至 ++/-- 操作,都只作用于副本
引用类型传参:改对象内容会影响实参
数组、String、自定义类实例等引用类型,变量存的是堆中对象的地址。传参时复制的是这个地址(不是对象),所以形参和实参指向同一块堆内存。
- 传 int[] arr = {1,2,3},方法里写 arr[0] = 99,外面 arr[0] 确实变成 99
- 调用 person.setName("Tom"),外部 person 的 name 也会变
- 关键点:改的是“对象的内容”,不是“变量的指向”
引用类型也有例外:重赋值不生效
如果在方法里让形参指向新对象,比如 arr = new int[]{4,5,6} 或 list = new ArrayList(),这种操作只改变形参变量本身,不影响实参。
- 因为只是把形参的地址副本换成了新地址,实参仍指着原来的对象
- 类似两人共用一张地图,一人把地图扔了换张新的,另一个人手里的原地图还在
- 所以判断是否影响外部,要看代码改的是“对象内部状态”,还是“变量指向”
String 是个特例:不可变但仍是引用类型
String 声明上是引用类型,但内部字符数组被 final 修饰,所有修改操作(如 concat、substring)都会生成新对象。
- 方法里写 s = s + "!",只是让形参指向新字符串,原字符串变量不变
- 行为像基本类型,但本质仍是引用传递——只是对象设计成不可变
- 想真正改变外部 String,得靠返回新值再赋值,不能靠参数传入修改

















