我是java技术的新手,也许这是一个简单的问题,但我很困惑。我知道java中没有引用调用的概念。它仅使用按值调用,即将副本传递给另一个方法
请检查以下代码的输出
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
System.out.println("Before Operate"+a + "," +b);
operate (a,b);
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append(y);
y = x.append("C");
y.append("D");
}
}
以上代码的输出是:ABCD , B (Second Syso)
我不知道为什么这会将所有内容附加到 a 中而不是 b 中。 我用谷歌搜索了很多,但它只会造成困惑。因此,如果有人完整地阐述它,那将会有很大的帮助。
提前致谢
P.S:-如果这个论坛已经有人问过这个问题,请给我一个链接,因为我找不到它。
最佳答案
是的,Java 总是按值传递,但您需要知道值是什么。对于对象,传递的值是对象的引用,而不是对象本身。请参阅Is Java "pass-by-reference" or "pass-by-value"?详细解释。
<小时/>i am not sure why this is appending everything in a not in b.
因为:
x.append(y);
y = x.append("C");
y.append("D");
与此完全相同:
x.append(y);
x.append("C");
x.append("D");
由于 StringBuilder#append()
返回 this
,因此对 y
的赋值
y = x.append("C");
使用对 x
(又名 a
).
关于Java 使用按值调用,但在 StringBuffer 的情况下行为很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811437/