Java只有值传递:基本类型传数值副本,修改不影响原变量;引用类型传地址副本,修改对象属性会影响原对象,但重新赋值地址则不影响。

Java 中没有真正的“引用传递”,只有值传递——但这个“值”,对基本类型是数据本身,对引用类型是对象的内存地址。理解这一点,就抓住了对象参数在方法中是否变化的本质。
基本类型:传的是数值副本,改了也不影响原变量
比如 int a = 5,变量 a 栈中直接存着数字 5。调用 fun(a) 时,JVM 复制一个 5 给形参,两者完全独立。方法内把形参改成 10,只动了副本,a 还是 5。
- 修改形参变量本身(如
x = 20)→ 不影响实参 - 所有基本类型(
int、boolean、char等)都如此
引用类型:传的是地址副本,指向同一对象
比如 Person p = new Person(),变量 p 存的不是对象,而是堆中那个 Person 实例的地址(如 0x7f8a)。调用 fun(p) 时,复制的是这个地址,形参也得到 0x7f8a,于是两个变量指向堆中同一个对象。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 通过形参修改对象属性(如
d.age = 10)→ 实参看到变化,因为操作的是同一个堆对象 - 但若在方法内让形参指向新对象(如
d = new Person())→ 实参仍指向原对象,不受影响
关键区分点:看操作的是“地址”还是“地址所指的内容”
真正决定是否影响外部的,不是“传的是什么类型”,而是“你在方法里做了什么”:
立即学习“Java免费学习笔记(深入)”;
-
赋值操作(
=):改变的是变量本身存储的值(数值或地址),只作用于当前变量 -
成员访问操作(
.xxx或[i]):顺着地址找到堆中对象,修改的是对象内部状态,所有指向它的变量都能看到 - 例如
StringBuilder sb:调用sb.append("x")→ 改对象内容,外部可见;而sb = new StringBuilder()→ 只换掉形参的地址,外部sb不变
String 和包装类是特例:不可变对象强化了“值传递”观感
String、Integer 等是不可变类。哪怕你写 s = s + "x",本质是新建字符串再让变量指向它——这和 int 赋值行为一致:都是改了变量持有的值(新地址或新数字),不波及外部。
- 它们仍是引用类型,传的也是地址副本
- 只是由于不可变性,任何“看似修改”的操作,实际都生成了新对象
- 所以表现和基本类型一样:外部变量看不到变化

















