一个古老的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方法中打印下结果,发现引用发生了变化,但是传递回来之后根本就没有变。好好体会下什么是值传递就会明白了