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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 莫运飞 中级黑马   /  2012-4-7 02:26  /  2369 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Foo

{

public static void main(String[] sgf)

{   

StringBuffer a = new StringBuffer("A");

StringBuffer b = new StringBuffer("B");  

  operate(a,b);  

  System.out.println(a+","+b);

}

static void operate(StringBuffer x,StringBuffer y)

{   

   x.append(y);  

  
}}

//输入的结果如何才能变成AB,AB
//而不是AB,B

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

7 个回复

倒序浏览
  1. class Foo

  2. {

  3.     public static void main(String[] sgf)

  4.     {

  5.         StringBuffer a = new StringBuffer("A");

  6.         StringBuffer b = new StringBuffer("B");

  7.        StringBuffer B= operate(a,b);
  8.            
  9.         System.out.println(a+","+B);

  10.     }

  11.     static StringBuffer operate(StringBuffer x,StringBuffer y)

  12.     {   

  13.      y=   x.append(y);    //这边x连接y变为AB,而y没有改变 所以还是B   
  14.       
  15.         return  y;

  16.     }
  17.    
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
System.out.println(a+","+b);  
这里你自己定义的是 b
最后怎么可能不是  B呢?
除非 是 在定义个 c  = operate(a,b);  

System.out.println(a+","+c);  
回复 使用道具 举报
StringBuffer a;和StringBuffer b;这两个变量是定义在main方法中的局部变量,只在main方法内部的代码范围内有效。
StringBuffer x, StringBuffer y这两个变量是operate方法的参数,也属于局部变量,只在operate方法内部的代码范围有效。
所以当值分别为“A”和“B”的StringBuffer对象传入operate方法时,后面简称为A对象和B对象,由于java中采用引用传递,即只是将原A、B对象的引用赋给了局部变量x、y而不是复制一份新的对象,所以x.append(y)直接修改了原A对象的值,变成了“AB”;(而y=x操作是将局部变量y作为了A对象的引用,但B对象仍旧是B对象(值已经被修改成BA),并没有变成A对象,只是局部变量的指向发生了改变)。此时operate方法运行结束,operate方法中的局部变量xy被销毁。继续回到main方法运行,main方法中的a、b局部变量仍分别指向A对象(值已经变成AB)和B对象,此时打印a、b,输出为AB,B。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
学习学习!!
回复 使用道具 举报
class Foo

{

public static void main(String[] sgf)

{   

StringBuffer a = new StringBuffer("A");

StringBuffer b = new StringBuffer("B");

StringBuffer c= operate(a,b);


  

  System.out.println(a+","+c);

}

static StringBuffer operate(StringBuffer x,StringBuffer y)

{   

   y=x.append(y);  

    return y;
}}
回复 使用道具 举报
我想楼主想要的是这个效果:
  1. /**
  2. *
  3. */

  4. /**
  5. * @author kilo
  6. * @createdate 2012-4-7
  7. */
  8. public class TestStringBuffer {

  9.         /**
  10.          * @author kilo
  11.          * @createdate 2012-4-7
  12.          *
  13.          * @param args
  14.          */
  15.         public static void main(String[] args) {
  16.                 // TODO Auto-generated method stub
  17.                 StringBuffer a = new StringBuffer("A");

  18.                 StringBuffer b = new StringBuffer("B");

  19.                 operate(a, b);

  20.                 System.out.println(a + "," + b);
  21.         }
  22.         static void operate(StringBuffer x, StringBuffer y)

  23.         {
  24.                 String temp = x.toString();
  25.                 x.append(y);
  26.                 y.insert(0, temp);

  27.         }
  28. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
pray 高级黑马 2014-4-26 03:46:07
8#
让斑竹看后决定加精固顶的好帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马