import java.util.*;
 class test{
 
 public static  void test(StringBuffer s1,StringBuffer s2){
 s1 = new StringBuffer("sss");
 s2.append("is good");
 
 }
 
 public static void main(String[] args){
 
 StringBuffer stra = new StringBuffer("A");
 StringBuffer strb = new StringBuffer("B");
 test(stra,strb);
 System.out.println("stra的值是:"+stra);
 System.out.println("--------------------");
 System.out.println("strb的值是:"+strb);
 }
 }
结果为:
stra的值是:A
--------------------
strb的值是:Bis good

解决方案 »

  1.   

    s1 = new StringBuffer("sss");这句话很重要,要理解,这里和C++是一样的.
    char*不能返回新的内存地址的.你的s1在传递后,引用不在test函数中被使用了,而是指向了新的对象.
    但是在main内,s1是不会发生变化的.
      

  2.   

    当数据或对象传递的时候,传的只是它的拷贝。题目中stra和strb分别是两个对象,stra和strb在栈中保存的是指向各自对象的地址,
    调用方法的时候,s1和s2获得的也只是它们的地址的拷贝。当执行s1 = new StringBuffer("sss");时只是把一个新的对象赋给了s1,也就是s1现在存的是新对象的地址,而stra并没有改变
    当执行s2.append("is good");的由于s2和strb指向的时同一个对象,这个操作不会影响strb的值但它对象变了··打个比方:
    两个人同用一台电脑,不管这两个人是死是活,电脑还是电脑,不会有任何变化。但是当其中一个人把电脑砸了的时候,另外一个人以后所使用的必然也是一台被砸过的电脑···
      

  3.   

    "char*不能返回新的内存地址的."
    小弟愚钝,,没明白你说的意思,能多解释一下吗?跪谢!
      

  4.   

    thinking in java 好像是12章 专门说这个问题,建议看看
      

  5.   


                                           -------> 传入的时候指向了A的外包类.
                                           |                                        
    public static  void test(StringBuffer s1,StringBuffer s2){
        s1 = new StringBuffer("sss");
         |
         --------->现在改指向了,指向了sss了. 但是实参A是不会受到影响的.
      

  6.   

    关键就是这句
     s1 = new StringBuffer("sss");
    s1指向了一个新的StringBuffer事例
      

  7.   

    当数据或对象传递的时候,传的只是它的拷贝??好像不对吧,如果参数,是基本数据类型 int,float 之类的,string ,stringbuffer,或自己写的类的对象,传递的时候都是怎么样的呢????
      

  8.   

    JAVA的参数,无论是基本类型还是对象的引用,传的都是个值拷贝。举例:
    1、基本类型:你有一个数i=100,你传的时候,就是拿了张纸,上面写了100,传过去。无论收到的人在纸上怎么改,你这里还是100。
    2、对象的引用,比如你的仇家住在某某地址,你手上有一个变量记住了这个地址,比如String a=new String("123");。
    你请了一个杀手去干掉那家伙,就把这个地址抄了一份给那个杀手。这杀手拿了这个地址,如果按地址去杀了,那么你再按这个地址去看,显然那人已经死了。这就是s2.append("is good");
    但是那杀手为了骗你,把你写的地址该成另一个人的,然后把那个人干掉。也就是s1 = new StringBuffer("sss");等你去看的时候,你要干掉的仇家还是好好的在那里。
      

  9.   

    hbwhwang(我是catmiw的马甲)的例子总是那么经典、易懂···呵呵··
      

  10.   

    小弟卡在:怎么判断是值传递还是地址传递?有没有一个标准,例如:"基本类型"作为方法的参数传递时是值传递(拷贝了一份);符合数据类型传得是地址(指地址空间);    以上这句话对不对?要是对的话我就按这个标准记了!如果不对,该怎么理解?   s1 = new StringBuffer("sss");这句我知道S1指向了一个新的地址空间,问题的关键是我弄不清楚怎么区分传递方式!
              多谢楼上的朋友帮忙,非常感谢,忘能继续帮忙!(小弟刚入行)
      

  11.   

    s1 = new StringBuffer("sss");
    这句在test方法里面new了一个对象,就是说他是和main函数脱离关系的另一个对象
      

  12.   

    可以这样理解:
    java中全是按值传递的,当参数是对象时调用该对象的方法可以改变对象的属性,但不可能改变整个对象,即不能使对象指向另一个对象。
      

  13.   

    test(stra,strb);
    public static  void test(StringBuffer s1,StringBuffer s2){
     //
     s1 = new StringBuffer("sss");
     //
    }
    对于
     s1 = new StringBuffer("sss");和简单类型的值传递是一样的.就象:
    int i = 0;
     method(i){
       i = 1;
    }
    在执行了method后i的值还是0
      

  14.   

    public static  void test(StringBuffer s1,StringBuffer s2){
     s1 = new StringBuffer("sss"); //这句话相当于没有就好理解了。
     s2.append("is good");
     
     }
      

  15.   

    cyeahpro() ( ) 信誉:100 
    test(stra,strb);
    public static  void test(StringBuffer s1,StringBuffer s2){
     //
     s1 = new StringBuffer("sss");
     //
    }
    对于
     s1 = new StringBuffer("sss");和简单类型的值传递是一样的.就象:
    int i = 0;
     method(i){
       i = 1;
    }
    在执行了method后i的值还是0老兄,这两个不一样的道理好不好
      

  16.   

    s1 = new StringBuffer("sss");
    这句在test方法里面new了一个对象,就是说他是和main函数脱离关系的另一个对象这种解释最简单而又合适。java中的参数 有时是传值 ,有时是传 引用,得具体情况具体分析……