请大家帮忙!谢谢了!!!

public class Test1_2 {
public static void test4(StringBuffer buffer1,StringBuffer buffer2){
buffer1.append(buffer2);
buffer2 = buffer1;
}
public static void main(String[] args) {
StringBuffer buffer1 = new StringBuffer("A");
StringBuffer buffer2 = new StringBuffer("B");
test4(buffer1,buffer2);
System.out.println(buffer1+","+buffer2);
}
}
为什么结果是:AB,B呢??

我们知道,[color=red][size=medium]Java中方法永远传值[/size][/color](这种值有两种:一种是[color=red]基本类型[/color],一种是[color=red]引用【或称地址】[/color]);

[[color=red]size=medium]对象在堆里面,引用在栈里面。[/size][/color]

在这个基础上,接下来我们分析下函数test4

[code="java"]public static void test4(StringBuffer buffer1,StringBuffer buffer2){
buffer1.append(buffer2);
buffer2 = buffer1;
} [/code]
这个静态函数test4接受两个引用为参数。
[code="java"]test4(buffer1,buffer2);
[/code]
传进两个参数(都是引用)
1,调用方法时在内存的栈中申请一块空间,其中[color=red]函数两个StringBuffer参数buffer1和buffer1[/color](这两个引用是参数的参数,所谓的形参,传经来的两个buffer1和buffer2是实参)。

2,将1步骤中的两个实参分别对应赋值给两个形参,函数中使用的都是形参,如
[code="java"]buffer1.append(buffer2);
buffer2 = buffer1; [/code]

3,“buffer1.append(buffer2); ” 这句真正修改的是[color=red]buffer1这个所引用所指向的对象[/color],并不是buffer1这个形参引用的值。

4,“buffer2 = buffer1;” 这句话是把引用buffer1的值(并不是所指向的对象)赋给buffer2这个形参引用,使这个引用(或称指针)指向另外一个对象。

通过上面的分析,知道真正修改的是buffer1这个引用所指向的对象,而buffer2所指向的对象并没有任何修改。
所以输出的结果是:AB,B

如果理解上有点困难,可以修改一下test4方法的参数命名:
如下:
[code="java"]public static void test4(StringBuffer b1,StringBuffer b2){
b1.append(b2);
b2 = b1;
}
[/code]

java中参数传递方式只有传值这一种方式, 对于buffer2 = buffer1; , 不会真的将Buffer1的内容复制给调用的buffer2参数的
参考[url]http://www.iteye.com/topic/4189[/url]

很简单啊,test4函数里面的buffer2与main里面的buffer2尽管它们有着相同引用,也就是说他们所引用的对象起初是相同的,但你要注意它们有着不同的地址,你在执行=操作的时候实际上该变的是test4里面的buffer2的引用,但是这完全不会影响到main函数里面的buffer2;但是如果你不是直接改变引用,而是改变对象的属性,此时由于两个buffer2所引用对象完全相同,它们的属性就都会得到修改(其实就一个对象)

[color=blue][b]用图文结合的方式,分析更好。类似地可以参见我的博客:[/b][/color]

[b]图解Java中的值传递和引用传递[/b]
[url]
http://xiaolongfeixiang.iteye.com/blog/652235[/url]

[b][color=blue]首先,你这是Java中的值传递的问题。[/color][/b]

[code="java"]public static void test4(StringBuffer buffer1,StringBuffer buffer2){
buffer1.append(buffer2);
buffer2 = buffer1;
}

修改为:
public static void test4(StringBuffer param1,StringBuffer param2){
param1.append(param2);
param2 = param1;
}
[/code]

[b]分析的流程如下:

[color=blue]STEP01 进入这个test4方法后,param1和buffer1指向的是同一块内存这块内存中的内容是“A” ,param2和buffer2指向的是同一块内存这块内存中的内容是“B” [/color]

parma1 --> "A" <-- buffer1

param2 --> "B" <-- buffer2

[color=blue]STEP02 param1.append(param2);这一句,param1操作它所指向的内存,将param2所所指向的内存内容,添加到了parma1指向内存的后面。[/color]

执行完以后:

parma1 --> "AB" <-- buffer1

param2 --> "B" <-- buffer2

[color=blue]STEP03 param2 = param1;这句话,改变了param2的指向,并不改变param2向的内容。将param2的内容改为指向param1.执行完后:[/color]

param1 --> "AB" <-- buffer1
|
param2

    "B" <-- buffer2

[color=blue]STEP04 然后跳出test4方法。局部变量param1、param2失效。[/color]

"AB" <-- buffer1

"B" <-- buffer2
[color=blue]
所以输出 AB B[/color]
[/b]

[b]用文字画图不太好画,呵呵,上述的STEP3中 param1--> “AB” buffer1-->"AB"
param2-->"AB" .注意3个指向的是同一个AB。

希望下面的图,没有错位。呵呵。(思路就是这样,自己可以画图分析一下)[/b]

[b]
param1
|
"AB" <-- buffer1
|
param2
[/b]

你可以用Eclipse调试来跟踪一下Variables就知道了。在你的test4方法中,我们看1、buffer1.append(buffer2); 看JDK文档
public StringBuilder append(StringBuffer sb)返回的是此对象的一个引用。
所以buffer1为AB;
2、buffer2=buffer1;
此时buffer2=AB;
但是这时,我们的参数传递过程就不一样了。由于buffer1.append()是对原来对象的引用,即引用(地址)传递,可以将修改后的值传回原来的地址。
而这里的buffer2这里是形式参数,形式参数的修改不能传递回实际的参数main方法中定义的buffer2。(用赋值"="Java都是值传递)。
所以在main方法中的buffer2还是"B".而buffer1已经在test4方法中修改了对象的引用,即修改了内存中的内容。buffer1为"AB".