public static void operator(StringBuffer x,StringBuffer y){

x.append(y);
y = x; }
   public static void main(String[] args) {
   
   StringBuffer a = new StringBuffer("A");
   StringBuffer b = new StringBuffer("B");
   
   operator(a,b);
   
   System.out.println(a + "," + b);//结构是 AB,A为什么不是AB,AB 
       
   }
// 对于值传递,引用传递,作用域 的理解我是这样的 大家帮我分析下   基本数据类型是值传递, 引用,数组等是值传递,作用域只要注意在调用的方法就行的域就行
// 但这题为什么不是AB,AB呢  帮我总结下这三个谢谢

解决方案 »

  1.   

    结果是 AB,BStringBuffer b 没有变过啊
      

  2.   

    分析起来有点麻烦。我尽量说得具体些。
    从main后第一句开始。
     StringBuffer a = new StringBuffer("A");
           StringBuffer b = new StringBuffer("B");
    栈内存分出两个区域a和b,分别指向堆内存的两个大区域,两个区域分别存储new出来 的“A”和“B”,至于a和b里的内容究竟是什么不用管它,只知道通过a和b里面的内容可以找到“A”和“B”,为了方便理解,且以为它存储的是堆内存里两个区域的地址。
    再看下一句。
     operator(a,b);
    将a,b的值传递给函数operator,注意 是值,按照我们的理解传递的就应该是堆内存的两个区域的地址。再看到operator函数,栈内存再开辟两个区域,分别是x和y,x的值就是a的值(即“A”的地址),y的值就是b的值(即“B”的地址)。所以x和y分别指向“A”和“B”。而在main里,a指向“A”,b指向“B”。
     x.append(y);
    这句好理解,x指向的内容(“A”)在该句后变成“AB”。
     y = x;
    将x的值(即“A”的地址)赋给y。此时y就指向了“AB”。
    那么,System.out.println(a + "," + b);就好理解了,a指向“AB”,b指向“B”,因此输出"AB,B"
      

  3.   

    虽然y指向了AB,但是y实在另一个栈里边,和main函数的栈里的b没有关系,b依然指向“B”
    画个图就好理解了
      

  4.   

     2楼 按你这思路是可以解决这道题 可下面这题 按你的思路怎么不通啊
            public static void stringReplace(String text){
    text=text.replace('j', 'i');//这里也该修改了值了吧??为什么结果就是没有呢 难道String传的不是地址是值??
    }

    public static void bufferReplace(StringBuffer text){
    text=text.append("C");
    }

       public static void main(String[] args) {
       
      String textString = new String("java");
      StringBuffer textBufferString = new StringBuffer("java");
      
      stringReplace(textString);
          bufferReplace(textBufferString);
          
          System.out.println(textString + textBufferString);// 结果javajavaC
          
         
       }
      

  5.   

    记住是值传递,虽然y的地址(值)改变了,但是b依然是b,传递过去的只是拷贝的地址值。
      

  6.   

      public static void bufferReplace(StringBuffer text){
            text=text.append("C");//外面看到的是append的效果,而不是“=”的效果,你可以把=去掉测试一下,这里这个=根本就没有必要存在
        }  public static void stringReplace(String text){
            text=text.replace('j', 'i');//这里也该修改了值了吧??为什么结果就是没有呢 难道String传的不是地址是值??
        }//这个方法根本没有任何有意义的功能
    这个去看String类的replace的说明,String是个不变类,所以设计到修改的方法都是返回来一个 新的对象,不对原来的对象进行修改。
      

  7.   

    String 是一个特殊的类,里边的成员是不能改变的,final