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")为什么一个添加到了字符串里,一个没有被添加
{
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")为什么一个添加到了字符串里,一个没有被添加
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
}
}
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方法时,传递参数其实是传递的是参数的引用,因此也就有了上述分解。
楼上很强悍 呵呵
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