public class A{
public void change(StringBuffer a)
{
      a=new StringBuffer("aaaaaaaa");
}
public static void main(String [] args)
{ Stringbuffer str=new StringBuffer("1111");
  A temp=new A();
  A.change(str);
  System.out.println(str);}
}
打印出来的为什么还是1111。
str是作为一个对象传递到change方法中的呀!在change方法里改变了str所指向的字符串(即aaaaaaa),所以打印出的应是aaaaaaa呀!小弟刚学JAVA不久,麻烦各位解答一下,叩谢!!!

解决方案 »

  1.   

    首先, 楼主不能写  A.change(str); 要知道只有static的方法才可以用类名点的形式。
      

  2.   

    传过去的是个引用没有错,但这个引用是保存在栈中,并且保存的是堆中的地址,所以这个值本身是个整形的变量,而你在change()里面又实例化一个对象,会在堆中新分配空间并在栈中创建一个新的变量a,所以并不影响str的值,但是如果你在change()里面直接去修改a的值,比如a.append("111"),那么str的值就变化了,这是因为你直接去修改了堆里面的内容,而引用没有变,所以才会起到你原本的目的~
      

  3.   

    传过去的是个引用没有错,但这个引用是保存在栈中,并且保存的是堆中的地址,所以这个值本身是个整形的变量,而你在change()里面又实例化一个对象,会在堆中新分配空间并在栈中创建一个新的变量a,所以并不影响str的值,但是如果你在change()里面直接去修改a的值,比如a.append("111"),那么str的值就变化了,这是因为你直接去修改了堆里面的内容,而引用没有变,所以才会起到你原本的目的~
    java用的是只传递 所以结果就是那样的 
    在执行的时候 所处 的 雷村地址是不一样的
      

  4.   

    new 出来了两个对象,所做的操作分别是在不同的地址空间中,所以对str是没有影响的
      

  5.   

    change()方法不是static的,所以不能写成A.chang();既然你new出来了一个temp对象了,应该写成这样temp.chang(),你这样写的话没有报错?
      

  6.   

    在change方法里面,你把a重新分配了一个新的地址,但是main方法的地址可没变。这里是按值传递了,当然改不了了额!
      

  7.   

    对这种传递引用类型的方法特别要注意:
    str ----> "1111" // new 了一个StringBuffer("1111")
    a -----> "aaaaaaaa" // 调用temp.change(str)方法中也 new 了一个StringBuffer("aaaaaaaa"),此时并不会改变 str 引用的对象,也不会改变 str;但如果你这样:str = a //将 a 的引用赋值给 str;
    str ----> "aaaaaaaa"
      

  8.   

    这个程序没法运行,像上面的朋友说的,由于类A不是static的,所以A.change(str);语句是错误的,要用temp.change(str)。
      

  9.   

    //按执行顺序说明一下:
    //下面的1111是在常量池中存储的常量字符串对象
    1.Stringbuffer str=new StringBuffer("1111");// 此时str->1111(即str指向的是1111)
    2.A temp=new A();
       A.change(str);  //此时a=str ->1111(即a也跟str一样指向1111,也就是说这个时候,a->1111,str->1111);
    3.  a=new StringBuffer("aaaaaaaa");//执行到这步的时候,在常量池中又创建了一个aaaaaaaa对象,此时的a变为指向aaaaaaaa了,即a->aaaaaaaa,而原来的str没有改变,还是指向原来的1111。