You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中模拟Pass by reference的方法为何失效?JDK15.0.1环境

为什么用数组模拟传引用后,原String变量的值还是没改变?

嘿,我来帮你捋清楚这个问题——其实核心还是没搞明白Java的参数传递到底是怎么回事,咱们一步步拆解你的代码:

首先,先明确一个关键事实:Java里只有值传递,没有真正的传引用。哪怕是对象类型,传递的也是「对象引用的副本」,不是引用本身。

咱们看你的代码细节:

  1. 在main方法里,你定义了String a = "foo",这里的a是一个引用,指向字符串常量池里的"foo"对象。
  2. 当你调用test(a)的时候,因为test方法的参数是String... a(可变参数,本质是String数组),Java会自动帮你把这个String类型的a包装成一个全新的长度为1的String数组,然后把这个新数组的引用的副本传递给test方法的参数a(注意:这个a和main里的a是完全不同的两个变量,只是名字一样而已)。
  3. 在test方法里,你执行a[0] = new String("bar"),这时候修改的是那个自动创建的新数组的第一个元素,让它指向了新的"bar"对象,但main方法里原来的那个a引用(指向"foo")根本没被碰过。
  4. 所以当test方法执行完回到main,你打印的还是原来的a指向的"foo"。

如果想要达到你预期的修改效果,得自己手动创建数组,把原引用放进去再传递,比如这样写:

public static void test(String[] a) {
    a[0] = new String("bar");
}
public static void main(String[] args) throws Exception {
    String[] arr = {"foo"}; // 自己创建数组,把引用放进去
    test(arr);
    System.out.println(arr[0]); // 这时候就会输出"bar"了
}

再总结一下:

  • 如果参数是对象类型,传递的是引用的副本。要是你修改的是对象的内部状态(比如给ArrayList加元素),原对象会跟着变;但如果是把参数的引用指向新对象(比如你的a[0] = new String(...)),那只是修改了副本的指向,原变量的引用不会受影响。
  • 你之前的写法里,Java自动创建了新数组,相当于多了一层“中转”,修改的是这个中转数组的元素,和原变量完全没关系。

内容的提问来源于stack exchange,提问作者NHSH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:31:23