日期:2014-05-20  浏览次数:20711 次

一个让我有点困扰的问题,关于StringBuff的
这段代码的运行结果为: a .. bb

如果将show方法里的两句换个位置,则输出:ab .. b

我是这样理解的:
show方法中,第一句是将参数S1指向S2的地址
这时候在SHOW方法中改变S1的值实际上是改变了S2所指向的地址

返回到Main方法后s1仍然指向的是以前的地址,也就是a,而s2所指向的地址已经改变

这么解释对不对??

Java code
public class Test {

    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("a");
        StringBuffer s2 = new StringBuffer("b");

        new Test().show(s1,s2);
        System.out.println(s1 + " .. " + s2);
    }
    void show(StringBuffer s1,StringBuffer s2)
    {
        s1=s2;
        s1.append(s2);
    }  
}


------解决方案--------------------
这个正说明了StringBuffer是可变的字符串,如果你show方法的参数改成String那就不对了.
------解决方案--------------------
在main函数中
s2代表的对象没有改变,只不过对象的内容变了
------解决方案--------------------
s2所指的位置没变 只是后面加了一个b 毕竟StringBuffer和String不同,不用重新申请地址空间
------解决方案--------------------
Java进行引用参数传递时, 实际上是传递一份地址拷贝;
在main()方法中, s1指向字符串"a",假设地址为A, s2指向"b",假设地址为B;
调用show()方法时,把A和B的地址拷贝传递给方法.所以你在show()内部对参数地址进行改变时并不会对外部栈的变量进行更改.但是你对内部地址指向的值进行更改时仍然会发生作用.