public class Test028{ 
   public static void main(String[] args){ 
   StringBuffer a=new StringBuffer("A"); 
   StringBuffer b=new StringBuffer("B"); 
   operate(a,b); 
   System.out.println(a+","+b);  //为什么在方法里b变为AB,而在输出却是B呢?
    } 
   public static void operate(StringBuffer x, StringBuffer y){ 
    x.append(y); 
    System.out.println("x= "+x);//输出AB
    y=x; 
    System.out.println("y= "+y);//输出AB
   } 

将a和b的参数传递给operate方法,因为a和b都是对象,方法可以改变对象的属性,在方法中,a通过append()改变了,变为AB,而y=x; 这句也将对象b的值改变了啊,方法结束后,对象的属性应该都是被改变的,为什么在System.out.println(a+","+b);  后,输出的却是AB,B呢???

解决方案 »

  1.   

    参数是按值来传的,x,y是两个指针,y=x这是使,y与x同指向而已,没有改指针指向的值。
      

  2.   

    执行这一步时operate(a,b);
    a与 StringBuffer x,b与StringBuffer y指向同一个对象,
    x.append(y);这时候这个对象变为"AB", y=x这一步y也指向了"AB"这个对象,但注意此时b与y指向的就不是同一个对象了,b指向的还是原来的“B”这个对象。
      

  3.   

    其实就是operate里面操作了a指向的对象,那个对象改变了,a自然也变了,b指向的对象却没有动过,打印的值自然没有变了。你在函数里操作x,y的只是值,而不是内存地址。楼上说指针的话属于误导,Java里没有指针,就算C++里,指针跟引用也是两个完全不同的概念
      

  4.   

    楼上的没错
    在Java里,没有象C和C++那样的指针。用new创建一个对象的时候,就会获得一个引用
      

  5.   

    想更详细点了解有看看c++与java的比较好了
    http://www.huihoo.com/java/c++_java.html
      

  6.   

    这是我在别的帖子中回答的类似问题 ,可以解决你的问题。 如下
    呵呵,不能简单的理解成是引用传递。应该说是传递的是地址的副本。先不考虑String,
    class A1 {    int t = 0;
    }
    public class Exam {    A1 a1= new A1();
        
        private void change(A1 param){
            param.t = 10;  
        }
        
        private void change2(A1 param){
            param = new A1();  //地址改变
            
            param.t = 100;
        }
        
        public static void main(String[] args){
            Exam eg = new Exam();
            
            eg.a1.t = 5;
           
            System.out.println(eg.a1.t);
            
            eg.change(eg.a1);
            
            System.out.println(eg.a1.t);
            
            eg.change2(eg.a1);
            
            System.out.println(eg.a1.t);
        }}, 最后说String,由于它是一个只读类,所以举例如下:String str = "abc";//生成一个对象
           str = "abc"+"def";  //str的地址改变了,重新生成一个对象内容为"abc"+"def"
                                 //然后把该地址赋给str,结合上边例子,应该讲清楚了吧