Java 参数传递:为什么换引用不等于改对象
在方法中给参数重新赋值,调用方的变量不会跟着改变;但通过参数修改 List 内容,调用方却能看到变化。这两种行为并不矛盾。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Java Tutorial for Beginners
Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
在方法中给参数重新赋值,调用方的变量不会跟着改变;但通过参数修改 List 内容,调用方却能看到变化。这两种行为并不矛盾。
理解核心机制
Java 按值传递。对象参数传入的是引用值的副本,双方起初指向同一对象;修改对象会影响共享状态,重新绑定参数只改变局部副本。设计方法时,应明确它是返回新值还是修改传入对象。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.util.ArrayList;
import java.util.List;
public class Demo {
static void change(List<String> items) {
items.add("shared");
items = new ArrayList<>();
items.add("local");
}
public static void main(String[] args) {
List<String> items = new ArrayList<>();
change(items);
System.out.println(items);
}
}适用边界与常见误区
按值传递不代表对象不可变。返回一个引用、包装一个集合或声明 final,都不能自动防止底层内容被修改。
继续练习
先画出方法调用前后的两个变量及它们指向的对象,再将 add 改成 clear。观察哪些变化跨过了方法边界。