class J_StringBuffer{
     public static void main(String args[]){
        StringBuffer a = new StringBuffer("A");
         StringBuffer b = new StringBuffer("B");
         mb_operate(a, b);
         System.out.println(a + "." + b);
     } // End of method: main      static void mb_operate(StringBuffer x, StringBuffer y){
        x.append(y);        //x=ab
           y=x;                //y的值与x的孩子相同
      } // End of method: mb_operate
} // End of class: J_StringBuffer
上面程序的输出的为什么是 AB.B?
class J_Test{
    public static void main(String args[])
    {
        int i= 99;
        mb_operate(i);
        System.out.print(i+100);
    } // End of method: main
    static void mb_operate(int i)
    {
        i+=100;//i的作用域不一样,所以两个i的值根本不一样。
    } // End of method: mb_ operate
} // End of class: J_Test
这个输出的为什么是199?      

解决方案 »

  1.   

    void f(int x){
      x = 2;
    }int x=1;
    f(x);
    你说x变了吗?
      

  2.   

    y=x;     这个只是一个地址的引用。。没有改变的只是y的值 没有改变b的值
      

  3.   

    问题1:你不能直接使用y=x,你应该使用y.replace(0, y.length(), x.toString());
    否则你没有改变y的值,只是将y的引用指向了x,当跳出mb_operate这个方法之后,b的值并没有改变,所以打印出来的是AB.B。问题2:和问题1一样,你使用Integer类的对象就可以了,而int是基本类型,在mb_operate方法中并没有改变main方法中i的值。
      

  4.   

    第一题:
    a------------>A<--------------x                               
    b------------>B<--------------ya------------>AB<-------------x.append(y)
    a------------>AB<--------------y=x结果:
    a------------>AB
    b------------>BStringBuffer是个引用数据类型,传的是引用地址
    x.append(y)
    当两个引用指向同一个值的时候,形参改变其中的值的时候
    实参自然也会改变
    y=x
    只是把x的地址赋给了y,使y与x指向了相同的地址
    但这和b是没有关系的,b指向的地址没有改变总结:
    引用传递,形参改变值的话,实参的值也会改变
              形参改变地址的话,和实参没有关系遇到这种题,一定要画内存图,是个万金油的方法
    光靠看不但浪费时间还容易出错。注意:
    Sting类型是个特殊的对象,处理起来会有不同
    楼主要注意一下,今天没有时间了,有时间再讨论讨论。第二题:
    自然是值传递了,改变形参的值和实参是没有关系的。
     
      

  5.   

    第一个程序中a,b是对象传过去的 a.append(b)执行结果是a="AB" a的内存发生了变化 而b=a只是在方法mb_operate中的b的引用指向a,而并没有改变main方法中b的值,所以在主方法中的b的值其实没变
    第二个程序你自己也写了 两个i的作用域不同,所以方法mb_operate中的i的变化与main方法中的i无关,所以打印出来的就是99+100,也就是199
      

  6.   


    class J_StringBuffer{ 
        public static void main(String args[]){ 
          StringBuffer a = new StringBuffer("A"); 
            StringBuffer b = new StringBuffer("B"); 
            mb_operate(a, b); 
            System.out.println(a + "." + b); 
        } // End of method: main   static void mb_operate(StringBuffer x, StringBuffer y){ 
          x.append(y);        //这个修改的是X引用指向的内容
          y=x;                //这个修改的是Y引用,Y是形参,方法返回后,Y自动清除,改变不会保留
      } // End of method: mb_operate 
    } // End of class: J_StringBuffer 
    上面程序的输出的为什么是 AB.B? 
    class J_Test{ 
        public static void main(String args[]) 
        { 
            int i= 99; 
            mb_operate(i); 
            System.out.print(i+100); 
        } // End of method: main 
        static void mb_operate(int i) 
        { 
            i+=100;//这个i对main函数的i没有任何影响 
        } // End of method: mb_ operate 
    } // End of class: J_Test 
    这个输出的为什么是199? 
    因为你在最后把main函数的那个i加了100才打印的