N.B。我对以下Enthuware.com答案的答案一无所知,sb.append(str)似乎导致主sb的变化,但sb = null却没有。
以下课程的输出是什么?
public class TestClass{
public void testRefs(String str, StringBuilder sb){
str = str + sb.toString();
sb.append(str);
str = null;
sb = null;
}
public static void main(String[] args){
String s = "aaa";
StringBuilder sb = new StringBuilder("bbb");
new TestClass().testRefs(s, sb);
System.out.println("s="+s+" sb="+sb);
}
}
s = aaa sb = bbb
s = null sb = null
s = aaa sb = null
s = null sb = bbbaaa
答案是:s = aaa sb = bbbaaabbb
永远记住,字符串是不可变的,你不能改变它们。在这种情况下,s指的是" aaa",无论testRefs()方法做什么,main()的变量s都会指向同一个字符串" aaa"。另一方面,StringBuilder是可变的。所以,最初sb指向一个包含" bbb"的StringBuilder对象。它的引用传递给testRefs()方法。在该方法中,我们将局部变量str更改为指向新字符串" aaa" +" bbb" =" aaabbb"。然后我们将此附加到某人身上。因此,sb现在包含" bbbaaabbb"。将本地引用str和sb(在方法testRefs()中)设置为null,不会影响main()方法的变量s和sb。