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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程旦 中级黑马   /  2012-4-19 20:47  /  2521 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public classTest {
  2.         public static void main(String[] args) {
  3.      StringBuffer a=new StringBuffer("A");
  4.      StringBuffer b=new StringBuffer("B");
  5.      fun(a, b);
  6.      System.out.println(a+"..."+b);
  7.         }
  8.         public static void fun(StringBuffer a,StringBuffer b){
  9.                 a.append(b);
  10.                 b=a;
  11.         }
  12. }
复制代码
这题的运行结果是AB。。。B
我着实不明白  不是b=a 给b赋值了吗??
我的理想结果是  AB...AB啊

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

正序浏览
其实b=a这句还是有效的,你可以在这个语句后加一个输出语句,输出a、b的值就得到你想要的结果了。我们先把fun方法里的a、b换做x、y(这样便于说明),当你调用fun方法时是将a、b的地址传给了x、y,这样x、y就指向了相应的A、B,然后执行x.append(y),这个语句就是在x所指向的StringBuffer这个容器里加一个B,这样由于a与x所指向的是同一个容器所以a就变为AB,然后执行y=x语句,这个语句是将x所指向的地址值赋给y这样y也指向AB,但是b的指向一直没有改变,始终指向B,所以就得到你所说的结果。(为了便于说明,将你fun方法里的a、b全换成x、y了,这样不会混)其实参数传地时传递的是地址值,在所调用的方法里(如本题的fun方法)进行运算的也是形式参数所指向的地址值而已,实参要想得到运算结果就只能通过接受return返回的结果。
回复 使用道具 举报
我用老毕的话说一下,就是,a,b都是容器,比如木桶,a里装一个A,b里装一个B,
你可以把b桶塞进a桶,也就是a.append(b);这时a桶里有AB,b桶里只有B,
b=a无效,因为StringBuffer类容器是唯一的,赋值无效。
回复 使用道具 举报
  1. public class Test {
  2.     public static void main(String[] args) {
  3.             //new StringBuffer("A");假如开辟的堆内存空间为0x223F new StringBuffer("B");堆内存的首地址为ox332F
  4. StringBuffer a=new StringBuffer("A");
  5. StringBuffer b=new StringBuffer("B");
  6. fun(a, b);
  7. System.out.println(a+"..."+b);
  8.     }
  9.     //当执行到这行代码是 在栈内存里开辟2块空间一个a的句柄值为OX223F和b的句柄值为OX332F
  10.     public static void fun(StringBuffer a,StringBuffer b){
  11.                     //这里 把堆内存空间里的OX223F的值进行append操作修改了该内存空间OX223里值 应为栈内存里主函数区a句柄指向的
  12.             //也是0X223 所以的是AB
  13.             a.append(b);
  14.             //这条语句并没有修改堆内存里的值 只是把栈内存fun区里的b指向的值改变了 对于栈内存主函数区b句柄指向的0x332f
  15.             //堆空间首地址没任何影响所以打印的是B
  16.             b=a;
  17.     }
  18. }
复制代码
回复 使用道具 举报
运行一下楼主就会明白了
class Test{
  public static void main(String[] args ){
  StringBuffer a=new StringBuffer("A");
  StringBuffer b=new StringBuffer("B");
  Oprate(a,b);
  System.out.println("方法完成之后AB"+a+","+b);
  System.out.println("方法完成之后的AB指向的对象为"+a.hashCode()+","+b.hashCode());
  }
  static void Oprate (StringBuffer x, StringBuffer y){
  x.append(y);
  y=x;
  System.out.println("方法完成之后XY"+x+","+y);
  System.out.println("方法完成之后的XY指向的对象为"+x.hashCode()+","+y.hashCode());
  }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马