public class StrBuffer {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer(); //5
sb.append("hello"); //6
foo(sb); //7
System.out.println(sb); //8
}
private static void foo(StringBuffer sb) {
// TODO Auto-generated method stub
sb.append("wow"); //1
sb = new StringBuffer(); //2
sb.append("foo"); //3
System.out.println(sb); //4
}
}
在上面我在line8中打印时。输出是“hellowow”....有人可以解释一下吗?
答案 0 :(得分:3)
sb.append("wow"); //1
您刚刚改变了传入的StringBuffer
个实例。
sb = new StringBuffer(); //2
您刚刚将本地参数指定为指向新的StringBuffer
实例。这对调用者或旧实例没有影响。
答案 1 :(得分:0)
首先,您将对main的sb的引用传递给foo。 在foo中,您将“wow”附加到引用的对象。
然后,在foo中,您创建一个新的StringBuffer对象,并将本地sb更改为指向它。
如果我重命名引用可能会更清楚:
public static void main(String[] args) {
StringBuffer sb = new StringBuffer(); //5
sb.append("hello"); //6
foo(sb); //7
System.out.println(sb); //8
}
private static void foo(StringBuffer ref) {
ref.append("wow"); //1
ref = new StringBuffer(); //2
ref.append("foo"); //3
System.out.println(ref); //4
}
传递给foo的'ref'只是对主sb的引用。您可以在foo中对ref(即.sb)进行操作,直到您将ref更改为引用其他对象为止。