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

为何在Java方法中修改String不会改变原变量?

为什么Java中传递String到方法修改后原变量不变?

这是Java的参数传递规则加上String的不可变性共同作用的结果,拆解来看:

1. Java的参数传递是「值传递」,不存在引用传递

Java里所有方法参数都是按值传递的:

  • 对于基本类型(比如int),传递的是变量值的副本,方法内修改副本不会影响外部原变量;
  • 对于引用类型(包括String),传递的是对象引用的副本——也就是指向对象内存地址的拷贝。方法内的参数变量和外部变量最初指向同一个对象,但如果在方法里给参数重新赋值,只是改变了这个副本的指向,完全不会影响外部变量的指向。

2. String是不可变类,无法修改原对象

String类的设计是不可变的:所有看似修改String的方法(比如toUpperCase()、substring())都不会改变原String对象的内容,而是创建一个全新的String对象并返回。

回到你的代码:

public class Main {
    public static void shout(String text) {
        // text原本指向外部的"hello"对象,调用toUpperCase()后生成了新的"HELLO"对象
        // 这里只是把方法内的text变量重新指向了新对象,和外部的message变量无关
        text = text.toUpperCase();
        System.out.println("Inside method: " + text);
    }

    public static void main(String[] args) {
        String message = "hello";
        // 传递的是message引用的副本,text和message最初都指向"hello"
        shout(message);
        // message仍然指向原来的"hello"对象
        System.out.println("Outside method: " + message);
    }
}

关于你的疑问补充

  • 你尝试返回修改后的String并重新赋值可行,是因为把新对象的引用赋值给了外部变量,相当于主动改变了外部变量的指向;
  • Java传递String时并没有复制整个String对象,只是复制了指向该对象的引用值——不可变性决定了你无法修改原对象的内容,而值传递决定了你无法通过方法参数改变外部变量的指向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 06:22:29