黑马程序员技术交流社区

标题: 关于Stringbuffer? [打印本页]

作者: ↙五线谱╲    时间: 2013-10-31 23:23
标题: 关于Stringbuffer?
public class StringBufferTest
{
        static void aMethod(StringBuffer sf1, StringBuffer sf2)
        {
                sf1.append(sf2);
                sf2 = sf1;
        }

        public static void main(String[] args)
        {
                StringBuffer sf1 = new StringBuffer("A");
                StringBuffer sf2 = new StringBuffer("B");
                StringBufferTest.aMethod(sf1, sf2);
                System.out.println(sf1 + ":" + sf2);
        }
}

既然在函数里sf2=sf1了,那么sf1和sf2应该指向同一一个对象,那么打印出来的也应该是AB:AB,可为什么是AB:B呢?请大神指路!
作者: 忄雾飞扬    时间: 2013-10-31 23:37
StringBuffer相当于 String 的字符串缓冲区,不能修改。但是可以通过append等方法的调用来改变该缓冲区的长度和内容。
作者: 陈家林    时间: 2013-11-1 02:19
晕啊,因为sf2=sf1 所以sf2中的指针(内存中的栈地址)就是sf1中的指针;一样的指针指向同个sf1堆中, 原来的sf2堆就给自动回收了,ok ok
作者: 零下五度的水    时间: 2013-11-1 03:13
public void change (int i) { i = 5; }
调用这个方法之后 i 的值是不会变化的,这个你应该知道吧,别问我为什么,原因好像是什么栈顶操作原理,跟天书似的
static void aMethod(StringBuffer sf1, StringBuffer sf2) { sf1.append(sf2); sf2 = sf1; }
sf1改变的是堆里的值,相当于改变了引用的对象的属性,sf1本身栈里的值没变,引用还是调用方法之前的引用
sf2改变的是栈里的值,跟上面那个 i 一样,方法改变栈里的值结束方法之后栈里的值是要回归的,所以你的 sf2 输出还是 B
作者: 黄炳期    时间: 2013-11-1 08:35
如果问题已经解决,请及时修改主题为“提问结束”。谢谢。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2