我相信这个问题是没个java大神的必经路

String作为引用变量,为什么在run方法里改变了值,在main方法里却没有改变?图片说明图片

老生常谈的问题了,值传递和引用传递的区别,这里明显是值传递。在main方法中定义的str变量指向test字符串。执行run方法的时候流程是这样的:再创建一个局部变量str,把它赋值为test。注意,此str变量非main函数中的str变量,作用域不同。因此在run方法中改变的是run方法中局部变量str的值。

图片说明
你的命名误导了你,这样看很容易看出 变量str的值根本没有改变过

这是一道经典面试题。run方法中,str变量是值传递,run方法中的str变量是外侧str变量的拷贝,在内存空间上占用的是不同的内存块。run方法中的str变量无论怎么变化,外侧str变量都不会受到影响

public static void main(String[] args) {
String str = "test";
StringBuffer strBuf = new StringBuffer("test");
run(str, strBuf);
System.out.println(str);
System.out.println(strBuf.toString());
}

public static void run(String str, StringBuffer strBuf) {
    str += "test2";
    strBuf.append("test2");
}

run方法里面str是参数的那个str,你改变的只是那个参数的值,而在执行run方法后,这个str就死掉了,而main里面的那个根本就没改变过