关于StringBuffer的疑问,help me!555……

[code="java"]

public static void main(String[] args) {

    StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
    test(a,b);
    System.out.println(a+","+b);

}

public static void test(StringBuffer a,StringBuffer b){
    a.append(b);
    b=a;
}

[/code]
这是我参加笔试的一道题,我写的是"AB,AB"!我认为传递的都是引用,所以……

最后的输出应该是" AB,B ",帮忙解释下! :cry:

建议看看这个帖子:http://www.iteye.com/topic/4189#
之后你会对参数传递有比较准确的理解。这道题目自然容易解答了。

Java里所有方法调用都是按值传递参数的,包括对象的引用。test里的a是main里的a的一份拷贝,它们虽然指向同一个对象但却是两份不同的引用;b也一样。对test里的b赋值不会对main里的b带来任何影响。
关于按值传递,请读读Java的基础资料。例如这个,[url]http://www.ibm.com/developerworks/cn/java/passbyval/index.html[/url]

送你一句:程序里会有对象以及对象的引用。对象就是占用内存比较大的东西,引用就是占用内存比较小的东西,可以看作是C里的指针。Java里的传值实际上是拷贝引用,而不是拷贝对象。
所以不管引用怎么变,只要不调用引用的方法,对象的任何属性都不会变。

Java里方法调用都是值传递,也就是说的原对像的副本(copy):
如果传的是引用类型时,是不能够改变原引用对像的引用的,但是引用对像的值是可以改变的。
上面风调用方法test(a,b)a的值则是AB,b的值因还是原来的引用所以值为B,但此时
内存里会出现一个新的对像这个对像,这个对像的值是为AB。