StringBuffer面试题求解释

SuperHurley 2017-09-14 12:02:41
public static void main(String[] args) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);
}

static void operate(StringBuffer a, StringBuffer b) {
a.append(b);
b=a;
}
如题,我认为答案是AB,AB;但是运行结果是AB,B;
这是为什么呢?
...全文
994 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用传递
w_sabre 2017-10-10
  • 打赏
  • 举报
回复
对于形参的修改,仅在方法内有效,像这样改写一下,就会发现,operate的b确实是AB,而原题输出的是main方法里的b static void operate(StringBuffer a, StringBuffer b) { a.append(b); b = a; System.out.println(b); } 此题的目的在于混淆变量的名称,如果operate的两个参数变为c和d,可能会更清楚一些。
miaoch 2017-10-10
  • 打赏
  • 举报
回复
引用 16 楼 qq_17829237 的回复:
我看这么多人解答却还是有点不懂,在这段例子中,Stringbuffer并没有new出来新的对象。而java中又没听过存在引用传递,所以有点看不懂。那个画狗的例子看了一下,但是在那个例子中,是重新再内存中开辟了一部分空间,但是这段代码没看到有谁开辟新的空间了。

StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);

//想象成

StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
//operate(a,b);
{
_a = a;
_b = b;
_a.append(_b);//_a指向的对象append了_b指向的对象。因为a也是执行_a指向的对象,即对a指向的对象产生了影响
_b=_a;//_b指向什么对象对b来说没有什么意义
}//_a,_b生命周期结束
System.out.println(a+","+b);
微凉gogogo 2017-10-10
  • 打赏
  • 举报
回复
我看这么多人解答却还是有点不懂,在这段例子中,Stringbuffer并没有new出来新的对象。而java中又没听过存在引用传递,所以有点看不懂。那个画狗的例子看了一下,但是在那个例子中,是重新再内存中开辟了一部分空间,但是这段代码没看到有谁开辟新的空间了。
无伤 2017-10-09
  • 打赏
  • 举报
回复
引用 3 楼 hzy38324 的回复:
值传递的原因,参考 用画小狗的方法来解释Java中的值传递
正解!
有点儿困 2017-10-09
  • 打赏
  • 举报
回复
把operate方法里的a换成c,b换成d,方法变为 static void operate(StringBuffer c, StringBuffer d) { c.append(d); d=c; } 这样就不会理解混淆了,就是这么简单
huatian5 2017-09-26
  • 打赏
  • 举报
回复
这大概和C++里面的形参、实参一个意思吧?
qq_22556823 2017-09-17
  • 打赏
  • 举报
回复
java函数只有值传递,operate函数接收的是变量a和b在堆上的地址值,进入函数后,函数中的局部变量a,b和函数外的a,b指向同一个堆地址,a.append(b);修改了b这个地址对应的值为AB,而b=a; 只是修改了局部变量b的指向为局部变量a的地址,相当于使局部变量a和b指向的是同一个堆地址,而全局变量a,b依然指向原有的堆地址。
-小龙人 2017-09-17
  • 打赏
  • 举报
回复
静态方法里虽然将b值改变了,但这个b只是这个方法内的一个变量,它与外边的b没有关系
靠谱么 2017-09-15
  • 打赏
  • 举报
回复
值传递和引用传递
  • 打赏
  • 举报
回复
main方法中的b和operate方法中的b在执行完b=a; 这句话之后不是同一个对象了
SuperHurley 2017-09-14
  • 打赏
  • 举报
回复
感谢各位花费宝贵的时间来给我这个菜鸟解答,今天看了一下午值传递,引用传递,妄以为懂,并得出了一个我自己能理解的方法! 在本例题中,将方法的形参改为b1,将b(假设地址是:0x11)传入方法,相当于b1=b(将引用b的地址赋给b1), 那么有b1(0x11),此时b1和b都指向同一个对象StringBuffer("B");再将引用a的地址(假设为0x22)赋值给b1,就有了b1(0x22),显然指向另一个对象了,而b仍然指向StringBuffer("B")!! 注意:b1=b和b=b1意义不同,牵涉到L-value和R-value的概念吧(can't get it!) 另外:int i=1; operate(i); syso(i); static void operate(int i){ i=2; } 类似的将operate()方法中的形参i换成j,开始传参,得j=i=1,j=2, 对j的第一次赋值和第二次赋值,然而i没变,所以输出是1。
极客曼巴 2017-09-14
  • 打赏
  • 举报
回复
楼上两位师兄正解
soton_dolphin 2017-09-14
  • 打赏
  • 举报
回复

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

        operate(a, b); // 把 a, b 的指向两个string buffer 的内存地址的值传进去
        System.out.println(a + "," + b);
    }

    static void operate(StringBuffer a, StringBuffer b) {
        a.append(b); // a 现在指向传入的 StringBuffer("A") 实例的内存地址
                     // 这个引用的实例被改动,变成了 AB
        b = a; // 但是这里b 原来引用的 StringBuffer("B")实例的内存地址被改了,不再指向传入的这个内存
               // 地址,而是指向了 a 所引用的内存地址。
               // 因此这个方法执行完以后,传入的b 所引用的实例没有改变
    }

helianus 2017-09-14
  • 打赏
  • 举报
回复
方法传递引用的问题,因为你没有搞清楚外面的b和里面的b是两个引用,在没有b=a之前,两个b变量同时指向一个对象这是没有问题的。但是b=a之后,里面的b和a指向了同一个对象,而外面的b还是指向了原来的对象,也就是B。 所以是AB,B
SexyCode 2017-09-14
  • 打赏
  • 举报
回复
「已注销」 2017-09-14
  • 打赏
  • 举报
回复
b作为参数,在operate方法里改变引用,返回后是没有效果的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧