这个打印结果怎么看的,有点绕

public class StringBugfferTest {
    private static void change(StringBuffer str11,StringBuffer str12){
        str12=str11;
        str11 = new StringBuffer(" new world");
        str12.append(" new world");
    }
    public static void main(String[] args) {
        StringBuffer str1 = new StringBuffer("goods");
        StringBuffer str2 = new StringBuffer("bad");
        change(str1,str2);

        System.out.println(str1.toString());
        System.out.println(str2.toString());
    }
}

img

首先,main函数中:
str1 = "goods"
str2 = "bad"
然后调用change函数,在change函数中:
str2 = str1 = "good"
str1 = " new world"
str2 = str2 + " new world"
change函数结束,回到main函数
输出str1:" new world"
输出str2:"good new world"
如果对你有帮助,望采纳

下面是我的理解,供参考:
首先 str1在main方法被初始化为 “goods” , str2被初始化为 “bad”;


然后在change方法里,str1的引用被赋给change方法的str12,str12在str1字符串(“goods”)的基础上追加了 “ new world”.(相当于代表main方法里的str1对象)
change方法的参数str11被赋一个新的字符串的引用,而不再是str1的引用。


接着,在main方法打印str1的字符串值,即 “goods new world”
然后str2的字符串值,即“bad” .(str2没有改变)

虽然都说java只有传值,但我觉得传址比较好理解

分析一下change方法:

  1. str12=str11; // 此时str12被覆盖成str11的地址,str11地址不变
  2. str11 = new StringBuffer(" new world"); // str11 变更为新对象,但作用域仅限与change方法,main方法中不会变更
  3. str12.append(" new world"); // 此时变更为str11的str12拼接新字符串,因为在同一地址里操作的,所以可以变更

所以结果为:

goods new world
bad

str1变了,str2 没变

img

img

img