A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ↙五线谱╲ 中级黑马   /  2013-10-31 23:23  /  647 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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呢?请大神指路!

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

4 个回复

正序浏览
如果问题已经解决,请及时修改主题为“提问结束”。谢谢。
回复 使用道具 举报
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

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 很给力!

查看全部评分

回复 使用道具 举报
晕啊,因为sf2=sf1 所以sf2中的指针(内存中的栈地址)就是sf1中的指针;一样的指针指向同个sf1堆中, 原来的sf2堆就给自动回收了,ok ok
回复 使用道具 举报
StringBuffer相当于 String 的字符串缓冲区,不能修改。但是可以通过append等方法的调用来改变该缓冲区的长度和内容。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马