WMX · 随记
·Java· 3 分钟阅读

Java 参数传递:为什么换引用不等于改对象

在方法中给参数重新赋值,调用方的变量不会跟着改变;但通过参数修改 List 内容,调用方却能看到变化。这两种行为并不矛盾。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Tutorial for Beginners

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

在方法中给参数重新赋值,调用方的变量不会跟着改变;但通过参数修改 List 内容,调用方却能看到变化。这两种行为并不矛盾。

理解核心机制

Java 按值传递。对象参数传入的是引用值的副本,双方起初指向同一对象;修改对象会影响共享状态,重新绑定参数只改变局部副本。设计方法时,应明确它是返回新值还是修改传入对象。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java14 行 · 可横向滚动
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。观察哪些变化跨过了方法边界。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档