有人可以解释StringBuffer的这种行为吗?

时间:2014-10-14 20:30:54

标签: stringbuffer

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”....有人可以解释一下吗?

2 个答案:

答案 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更改为引用其他对象为止。