import java.lang.StringBuffer;
public class Test { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer a=new StringBuffer("A");
        StringBuffer b=new StringBuffer("B");
       operate(a,b);
       System.out.println(a+","+b);  
        
         }
public static void operate(StringBuffer x,StringBuffer y)
{
x.append(y);
y=x;

}}输出结果是AB,B。
**想问下问什么变量b输出的值是B???为什么operatr方法中语句“x.append(y)”可以影响到方法外的a的值,
但语句“y=x”却没有影响到方法外b的值?**

解决方案 »

  1.   

    x 指向 a
    y 指向 b
    x 调用方法 => a 调用方法
    y 指向 x
    方法结束 x,y生命结束最终外部结果:a 调用了方法 老生常谈 日经贴
      

  2.   

    java中传递参数有两种方式,值传递也引用传递。
    1.对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
    2.对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
    上面说的第二种本质上也是值传递,传递的对象本身并不会改变,改变的仅仅是该对象的成员的值。
      

  3.   


    就是y指向了那个append后含字符串“AB”的StringBuffer,之前y,b都指向StringBuffer "B"
    但这没有意义,因为y马上就要死了,operate()方法结束之时也就是它的死期。
    而b还活着
      

  4.   

    因为StringBuffer是对象,在传值给方法的时候参数是对象句柄的副本。也就是在这个方法开始的时候会有句柄x=a,y=b;在方法内处理的时候
    x.append(y):此时x=a,两个指的同一个对象x,因此他们所指的对象会改变。
    y=x:此时b句柄副本y已经从指向B对象,到指向x对象,但是b句柄还是指向B对象。B对象未作任何操作。所以结果还是之前的初始赋值。
      

  5.   

    昏,写错,更正下
    y=x:此时b句柄副本y已经从指向B对象,到指向A对象
      

  6.   

    正解,不过String虽然是引用类型,却有点特殊。
      

  7.   

    这个帖子你可以参考下:
     http://topic.csdn.net/u/20110613/12/1cb3a916-b756-423d-bbff-be97a9d2a8b9.html
      

  8.   

    import java.lang.StringBuffer;
    public class Test {/**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    StringBuffer a=new StringBuffer("A");
      StringBuffer b=new StringBuffer("B");
      operate(a,b);
      System.out.println(a+","+b);   
        
      }
    public static void operate(StringBuffer x,StringBuffer y)
    {
    x=y;
    x.append("C");}}
    楼主看看这个代码的运行结果
      

  9.   

    a-->A
    b-->Bpublic static void operate(StringBuffer x,StringBuffer y)
    // x=a -->A
    // y=b -->B
    {
    x.append(y);
    //x-->x+"B"="AB"
    y=x;
    // y=x -->"AB"
    在这里y与x的指向相同,脱离与b的关系,所以b仍指向B}