日期:2014-05-20  浏览次数:20735 次

高手请指教
public class Test {

public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
method(a, b);
System.out.println(a + "," + b);
}

static void method(StringBuffer x, StringBuffer y) {
x.append(y);
  y = x;
}

}
请问为什么输出结果是AB,B??

------解决方案--------------------
new StringBuffer("A"); 和 new StringBuffer("B"); 是两个对象,我们暂且叫它:对象A 和 对象B

StringBuffer a 和 StringBuffer b 是主调函数的两个变量,我们就简称:变量a 和 变量b

StringBuffer a = new StringBuffer("A"); 变量a 引用了 对象A
StringBuffer b = new StringBuffer("B"); 变量b 引用了 对象B
method(a, b); 调用函数method,并传递了两个变量a和b的值(这个值其实就是对象的引用,有点像C语言的指针值)

static void method(StringBuffer x, StringBuffer y) { // 两个形参变量,简称:形参x 和 形参y
// 注意,函数调用刚开始的时候,形参x得到了变量a的值,那么也就引用了对象A
x.append(y); // 调用形参x所引用对象的append函数,那么其实可以理解为“对象A.append(对象B)”
y = x; // 形参y转而去引用形参x值,那么形参y就指向了对象A
}
但是注意到形参x和形参y的引用的变化,并不会对变量a和变量b产生之间影响。因为他们本来就是毫无关系的4个变量。


如果你还疑惑,可以在函数method最后增加一句话:
y.append(y);