为什么在Java方法中修改一个字符串不会改变原来的变量?

编程语言 2026-07-09

我注意到,当把一个String传给一个方法并在里面修改时,原始变量并不会改变。但我以为字符串是对象,在Java中对象是按引用传递的。

为什么会这样?

public class Main {
    public static void shout(String text) {
        text = text.toUpperCase();
        System.out.println("Inside method: " + text);
    }

    public static void main(String[] args) {
        String message = "hello";
        shout(message);
        System.out.println("Outside method: " + message);
    }
}

观察到的输出:

Inside method: HELLO
Outside method: hello

我本以为两行都会打印HELLO,因为我在方法里修改了这个String。

我已经尝试过的做法:

  • 我对一个int变量也做了同样的处理,结果外部仍然没有变化,所以我以为这只是一个原始类型的问题。
  • 我搜索了“Java将字符串传给方法”,但结果讨论的是按值传递与按引用传递,并没有清楚解释为什么String会这样表现。
  • 我尝试返回修改后的String并重新赋值,结果可以,但我想理解为什么最初的方法不起作用。

这是否与String的不可变性有关?Java在把String传给方法时是否总是复制?

解决方案

upperCase() 方法会创建一个包含原始字符的新对象,但字符是大写的。

然后,进入shout方法内部:

text = text.toUpperCase();

变量获得了一个指向新字符串的不同引用。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章