为何在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
相关产品推荐
相关产品推荐

