为什么在Java方法中修改一个字符串不会改变原来的变量?
我注意到,当把一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。