public class Buffer 
{ public  void swap(StringBuffer a, StringBuffer b)
{
a.append(" more");
b = a;
}
public static void main(String[] args)
{
StringBuffer a = new StringBuffer("One");
StringBuffer b = new StringBuffer("Two");
Buffer buffer = new Buffer();
buffer.swap(a, b);
System.out.println(a+"  \n"+b);
}
}
输出是
One more  
Two
问:b应该也是One more,b已经指向a了啊?不解,求教!

解决方案 »

  1.   

    问:b应该也是One more,b已经指向a了啊?
    被改变的是局部变量b的指向public void swap(StringBuffer a,StringBuffer b){
    a.append(" more");
    b = a;
    System.out.println(" swap b :"+b);
    }
      

  2.   

    因为Java是值传递,所以b的值不会改变,但是a调用了append方法,所以a的值变为了one more,如果你把a.append(" more");改为a=“One more”试试看,运行后的结果应该是
    One
    Two
      

  3.   

    又不是修改的地址!
    只是一个局部的!
    swap(StringBuffer a,StringBuffer b)
    传过来的是又建的,执行完之后释放!
      

  4.   

    帮楼主排个版先public class Buffer
    {
       public  void swap(StringBuffer a, StringBuffer b)
       {
          a.append(" more");
          b = a;
       }
       public static void main(String[] args)
       {
          StringBuffer a = new StringBuffer("One");
          StringBuffer b = new StringBuffer("Two");
          Buffer buffer = new Buffer();
          buffer.swap(a, b);
          System.out.println(a+"  \n"+b);
       }
    }
      

  5.   

    反正就是java是值传递的,我也是刚学,具体的说不清楚
      

  6.   

    引用类型的参数传递给方法后,方法中会复制一份该引用的拷贝,这些拷贝为该方法的局部参数,swap()方法执行后的内存图:由此可见,执行b = a;这个语句后
    被改变去指向"One more"的是方法中的形参b,而方法外部的实参b仍然指向"Two",因此b最后的打印结果为:Two
      

  7.   

    这个问题是作用域的问题!public class Buffer 
    { public  void swap(StringBuffer a, StringBuffer b) 

    a.append(" more"); 
    b = a; 
    System.out.println("test local b:"+b);

    public static void main(String[] args) 

    StringBuffer a = new StringBuffer("One"); 
    StringBuffer b = new StringBuffer("Two"); 
    Buffer buffer = new Buffer(); 
    buffer.swap(a, b); 
    System.out.println(a); 
    System.out.println(b);} 

    执行结果为:test local b:One more
    One more
    Two
    结论:1、Stirngbuffer是对象,所以不是值传递问题      2test local b:One more 说明b的值是被改变的,只是在局部,该局部块执行结束后就被释放了!
      

  8.   

    public class Buffer { public StringBuffer swap(StringBuffer a, StringBuffer b) {
    a.append(" more"); //a  b 都是栈内存的变量"One" "Two"是堆内存的内容
    b = a;
    return b;
    } public static void main(String[] args) {
    StringBuffer a = new StringBuffer("One");
    StringBuffer b = new StringBuffer("Two");
    Buffer buffer = new Buffer();
    b=buffer.swap(a, b);
    System.out.println(a + "  \n" + b);
    }
    }
    建议楼主把栈内存和堆内存、参数传递部分看一下。
    11楼画的那个图十分的准确。
      

  9.   

    除了11楼,我觉得其他都没有讲清楚或者观点错误其实就是11楼那个图,首先main函数中的StringBuffer a = new StringBuffer("One"); 
    StringBuffer b = new StringBuffer("Two"); ,都是指向heap上的对象
    swap方法中的a,b只是两个StringBuffer引用的拷贝,但是这两个拷贝却是和main方法中的a,b指向heap上同样的对象,StringBuffer是字符串可变操作类,你用append方法,改变的是heap上的对象,所以不管swap里的a 还是main中的a的"内容"都得到了改变,而swap中的b=a,只是改变了引用拷贝b的引用对象,和main函数中的b是没有关系的!我不知道我表达的LZ有没有理解。
      

  10.   

    我比较赞同3楼的意见。
    11楼的图很nice,但是并没有解释到位(我还是有些疑惑)比如稍微改变一点代码public class Buffer
    {void swap(StringBuffer a, StringBuffer b)
    {
    a.append(" more");
    b = a;
    }
    public static void main(String[] args)
    {
    StringBuffer a = new StringBuffer("One");
    StringBuffer b = new StringBuffer("Two");
    Buffer buffer = new Buffer();
    //buffer.swap(a, b);
    a.append(" more");
    b=a; //java是指传递,因此将a的地址附给a并不能改变b的值
    System.out.println(a+"  \n"+b);
    }
    } 它的输出值还是一样!用#11如何去解释呢?
      

  11.   

    都输出one more,有什么问题吗?
    a.append(" more"); 改变a指向的heap中的StringBuffer对象为one more
    b=a;使b指向和a同样的位于heap中的StringBuffer对象,所以也是one more
    不知道你哪里不理解了?
      

  12.   

    你的这段修改后的代码不牵扯到方法中参数的传递(没有用到swap()方法),内存中只有一份a,b的引用的拷贝,内存图如下:
    附:18楼修改后的代码public class Buffer
    {
       void swap(StringBuffer a, StringBuffer b)
       {
          a.append(" more");
          b = a;
       }
       public static void main(String[] args)
       {
          StringBuffer a = new StringBuffer("One");
          StringBuffer b = new StringBuffer("Two");
          Buffer buffer = new Buffer();
          //buffer.swap(a, b);
          a.append(" more");
          b=a;
          //java是指传递,因此将a的地址附给a并不能改变b的值
          System.out.println(a+"  \n"+b);
       }
    }输出结果:
    One more
    One more
      

  13.   

    java中只有传值,没有像c++中的传引用,
    值虽然是不变的,但值指向的对象是会改变的,如果你想改变传进去的参数,请设计返回相应对象类型的方法f(),用b=o.f()这样的形式就可以了。