为什么sun要这么 做
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);// 9 goodhah这里为什么是 goodhah
System.out.println(s2);// 10 bad
但这里为什么是 bad
} static void test(StringBuffer s, StringBuffer s2) { // 此
System.out.println("s="+s);// 1 good
System.out.println("s2="+s2);// 2 bad
s2 = s;// 3
s = new StringBuffer("new");// 4
System.out.println("s="+s);// 5 new
System.out.println("s2="+s2);// 6 good
s.append("hah");// 7goodhah
s2.append("hah");// 8
System.out.println("s="+s+">>>>>>>>>");// 9 newhah
System.out.println("s2="+s2+">>>>>>>>>");// 10 goodhah
}
高手们解答 一下
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);// 9 goodhah这里为什么是 goodhah
System.out.println(s2);// 10 bad
但这里为什么是 bad
} static void test(StringBuffer s, StringBuffer s2) { // 此
System.out.println("s="+s);// 1 good
System.out.println("s2="+s2);// 2 bad
s2 = s;// 3
s = new StringBuffer("new");// 4
System.out.println("s="+s);// 5 new
System.out.println("s2="+s2);// 6 good
s.append("hah");// 7goodhah
s2.append("hah");// 8
System.out.println("s="+s+">>>>>>>>>");// 9 newhah
System.out.println("s2="+s2+">>>>>>>>>");// 10 goodhah
}
高手们解答 一下
我给你剖析下以下这行代码,你再重新分析过代码。
StringBuffer s = new StringBuffer("good");
1、在jvm中的栈里创建了一个变量s
2、在jvm中的堆里创建了一个StringBuffer对象的区域,里面存有值“good”
3、变量s的引用指向上述2所创建的堆区域
也就是说在jvm里s和new StringBuffer("good")是分开的,这也是解除你疑惑的关键点再给你剖析下s2 = s;这行代码:
s2这个变量的引用指向s这个变量的引用
public class Test03 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("good");
//此处 s 在内存的堆中 但是good在内存的栈中 s 是指向 good 的一个标记 简单来说是 内存的高四位地址
StringBuffer s2 = new StringBuffer("bad");
//此处 s2 在内存的堆中 但是bad在内存的栈中 s2 是指向 bad的一个标记 简单来说是 内存的高四位地址
test(s, s2);
System.out.println(s);// 9 //因为在test中s 重新指向了 另外一块 地址所以s最后的值是
goodhah
System.out.println(s2);// 10 bad //此处 是s2虽然在test中s2 =s 但是s2所指向的标记 bad并没有变 所以依旧是bad
但这里为什么是 bad
}static void test(StringBuffer s, StringBuffer s2) { // 此
//此处s s2 的值都是上面传进来的 (java 只有 值传递)System.out.println("s="+s);// 1 good
System.out.println("s2="+s2);// 2 bad
s2 = s;// 3
//此处s2的引用指向了s 也就是 s 指向的引用值 goods = new StringBuffer("new");// 4
//此处s 被重新定义 及 s 指向new 的地址 及s的指向的值是new
System.out.println("s="+s);// 5 new
System.out.println("s2="+s2);// 6 goods.append("hah");// 7goodhah
//此处 s的值是good good+hah s 指向的栈中存的值是goodhad
s2.append("hah");// 8
//此处 s2的值是new new +hah s2 指向的栈中存的值是newhad
System.out.println("s="+s+">>>>>>>>>");// 9 newhah
System.out.println("s2="+s2+">>>>>>>>>");// 10 goodhah
}
各位大虾 请赐教,不知道我说的对不对!!!哈哈哈哈 !
http://bbs.csdn.net/topics/390245117
这个说的很对。
分析一下你的例子:
s2 = s;// 3 s2指向了s的地址
s = new StringBuffer("new");// 4 s指向了另外一个新的地址所以这一句:s2.append("hah");// 8,它才是改变了原始的s值的“罪魁祸首”,你把它改成s2.append("i am s1"); 看看输出,会看得更明白。至于7中对s的操作,此s已非main中的s,当然不会影响main中的s值。不知道我有没有说得更明白些。。
把你的代码稍作修改
static void test(StringBuffer s, StringBuffer s2) { // 此
System.out.println("s=" + s);// 1 good
System.out.println("s2=" + s2);// 2 bad
s2 = s;// 3
s = new StringBuffer("new");// 4
s2 = new StringBuffer(s.toString()); System.out.println("s=" + s);// 5 new
System.out.println("s2=" + s2);// 6 good s.append("hah");// 7goodhah
s2.append("hah");// 8 System.out.println("s=" + s + ">>>>>>>>>");// 9 newhah
System.out.println("s2=" + s2 + ">>>>>>>>>");// 10 goodhah
}