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

一个古老的java传参问题
Java code

public class Test {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A ");
        StringBuffer b = new StringBuffer("B ");
        operate(a, b);
        System.out.println(a + ", " + b);
    }
    
    public static void operate(StringBuffer x, StringBuffer y) {
        x.append(y);
        y = x;
    }    
}



答案是 AB,B  
如何解释呀????

------解决方案--------------------
java方法参数传递只有1种。 就是值传递。
y = x; 虽然在方法里y的地址变成了x 但出了函数y还是y,也就是B。

而x是改变了x里面的值。 
如果你会C就好理解了。 x和y都用值传递,传了指针。
在operate里,
x指针的内容被改了。
y指针的地址改了。

出了operate方法后,
x的内容被改了, y由于是值传递又恢复y自己了。


------解决方案--------------------
x和a指向同一个地址,x改变地址中的内容,所有a的内容为A B,y和b开始指向同一个地址,在方法中, y = x;只是改变y的指向,而b所指的内容并没有改变!!
------解决方案--------------------
函数中,对形参x是直接调用其所引用对象的 append 方法,变化将直接作用于实参a。

而对于形参y,只是重新赋值以更换了引用对象(地址),这种变化完全跟实参b无关。
------解决方案--------------------
这是一个很常见的问题。在java中只有值传递。对于传递的对象,只会改变内容,而不会改变其引用。如果你在operator方法中打印下结果,发现引用发生了变化,但是传递回来之后根本就没有变。好好体会下什么是值传递就会明白了