public class Test03




  public static void main(String[] args)
  {
     StringBuffer s= new StringBuffer("good");
      StringBuffer s2=new StringBuffer("bad");
   test(s,s2);
   System.out.println(s);
   System.out.println(s2);
  }
   public atatic void test(StringBuffer s,StringBuffer s2)

  System.out.println(s);//1
    System.out.println(s2);//2
   s2=s;//3
  s=new StringBuffer("new");//4
 System.out.println(s);//5
   System.out.println(s2);//6
  s.append("hah");//7
  s2.append("hah");//8
 }
 }这个程序不能输出怎么改??还有最后两个s.append("hah")
  s2.append("hah")为什么一个添加到了字符串里,一个没有被添加

解决方案 »

  1.   

    package sample;public class Te {
    public static void main(String[] args){

     StringBuffer s= new StringBuffer("good");
     StringBuffer s2=new StringBuffer("bad");
     test(s,s2);
            System.out.println(s);
        System.out.println(s2);
    } public static void test(StringBuffer s, StringBuffer s2) {
    System.out.println(s);// 1
    System.out.println(s2);// 2
    s2 = s;// 3
    s = new StringBuffer("new");// 4
    System.out.println(s);// 5
    System.out.println(s2);// 6
    s.append("hah");// 7
    s2.append("hah");// 8
    }
    }
      

  2.   

    static写错了 连编译都通过不了 当然不会输出
      

  3.   

    为了解释方便将test方法的参数名改成a,b。代码如下 public static void test(StringBuffer a, StringBuffer b) {
    System.out.println("1--->" + a);// 1
    System.out.println("2--->" + b);// 2
    b = a;// 3
    a = new StringBuffer("new");// 4
    System.out.println("5--->" + a);// 5
    System.out.println("6--->" + b);// 6
    a.append("hah");// 7
    b.append("hah");// 8
    System.out.println("7--->" + a);// 9
    System.out.println("8--->" + b);// 10
    } public static void main(String[] args) {
    StringBuffer s = new StringBuffer("good");// d1
    StringBuffer s2 = new StringBuffer("bad");// d2
    test(s, s2); // d3
    System.out.println(s);// d4
    System.out.println(s2);// d5
    }这里其实就是java的核心,传值还是引用。上述代码应该如下分解:创建对象StringBuffer s = new StringBuffer("good");我们记做 s指向good的内存地址,简单表示为s->good.那么:d1:  s->good;
    d2:  s2->bad;
    d3:  a->good,s->good , b->bad,s2->bad;1: 输出a,由于a->good,s->good,那么应该输出good
    2: 输出b,由于b->bad,s2->bad,那么应该输出bad
    3:b->good;
    4: a->new; 此时a不再指向good
    5: 输出a,由于a->new,那么应该输出new
    6: 输出b, 由于3,那么应该输出good
    7: a->new+hah;
    8: b->good+hah,s->good+hah;
    9: 输出a,由于a->new+hah,那么应该输出newhah
    10: 输出a,由于a->new+hah,那么应该输出goodhahd4: 输出s: 因为8,那么应输出goodhah;
    d5: 输出s2: 由于s2的指向一直未变动,那么输出为bad
    其是你可以把StringBuffer s = new StringBuffer("good")看作,现在内存中创建一个对象值为 good,这个对象是放在堆中的,然后创建了一个s引用,他指向堆中的good所在内存地址。s引用是在栈中的。当调用test方法时,传递参数其实是传递的是参数的引用,因此也就有了上述分解。
      

  4.   

     
    楼上很强悍 呵呵
    StringBuffer s= new StringBuffer("good");//堆
     StringBuffer s2=new StringBuffer("bad");
     test(s,s2);
                System.out.println("1:"+s); //goodhah
        System.out.println("2:"+s2); //bad
    }....                s2 = s;// 3
    s = new StringBuffer("new");// 4
    System.out.println("5:"+s);// 5
    System.out.println("6:"+s2);// 6
    s.append("hah");// 7