问题描述
- String 引用变量的相关问题
-
package test02;public class Test09 {
public static void main (String [] args){
String str = "12345";
change(str);
System.out.println(str);
}
public static void change(String str){
str="welcome";
}}
为什么是12345
解决方案
String str = "12345";这里可以看成是值类型传递,形参改变,实参不会改变。
解决方案二:
string永远是只读的,你不能改变string,你重新赋值或者任何计算,都会创建新的String对象,并且指向它。
所以str="welcome";把形参指向了新的welcome的引用上,而不是改变str实参的内容。
解决方案三:
看如下代码:
class A
{
public int x;
}
void change1(A a)
{
a = new A();
a.x = 123; //指向新的对象,再改变,不影响原来的对象
}
void change2(A a)
{
a.x = 123; //修改对象的状态,会影响
}
解决方案四:
变得是形参,不是实参
解决方案五:
[java]String变量的内存分配问题
解决方案六:
字符串“12345”存在一个地址,"welcome",存在另一个地址,main中的str存在一个栈内存中指向"12345"的地址,change中的str存在栈内存的另一个位置,调用change使得,change中str变量同样指向了"12345"所在的地址,执行str="welcome"时,使得change中的str指向了字符串池中"welcome"的地址
解决方案七:
String对象是不可变的,当把String对象当做参数传递给方法时,Java都会复制一份引用(也就是局部引用,比如你这里的change(String str)中的str)其实跟你main方法中的str是不一样的,内容虽然一样,但是内存地址是不一样的。你改变的只是局部引用指向的新内容welcome,而main方法中的str是没有重新指向welcome的。