代码
class Test {
public static void main(String args[]) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
modify(a, b);
System.out.println(a + " " + b);
}
public static void modify(StringBuffer a, StringBuffer b) {
a.append(b);
a = b;
System.out.println(a + " " + b);
}
}
我理解函数modify
中的print语句,我也知道StringBuffer
类修改了字符串inplace因此a.append(b)
使字符串引用“AB”。
我的问题是如何在String a
函数之外将modify
更改为“AB”,但声明a=b
在函数modify
之外没有影响。 基本上,当变量按值传递时,何时按引用?
答案 0 :(得分:2)
Java
始终使用按值传递。在引用的情况下,它是引用的值。传递引用时,可以更改引用引用的对象,但分配给其他对象的引用没有任何后果。
因此,在您的情况下,a
引用的对象可以更改,但引用不能分配给其他对象(它可以这样,但没有效果)。
答案 1 :(得分:2)
这是一张简单的图片:
main modify
StringBuffer <------a a
^ |
+--------------------------+
StringBuffer <------b b
^ |
+--------------------------+
在main
中,a
和b
都是指向单独的StringBuffer实例的引用。当main
调用modify
时,它会传递引用a
和b
的副本(按值传递)。 modify
可以更改StringBuffer实例的内容,但是如果它更改了a
和b
的值,它只能在自己的本地副本上运行,不会影响{{1} } main
和a
指向。
基本答案是所有按值传递,但传递对象时,它是传递的引用(按值),而不是对象本身。
答案 2 :(得分:0)
包含对象的变量实际上是对象的引用。因此,如果将其分配给另一个变量,则两个变量都引用同一个对象。
将变量传递给函数时,会传递值。
对于对象,传递的值是引用。
因此,您可以将b分配给in in,但效果是参考b的本地值,之后它们都是相同的并且引用对象b。将b附加到a时,您正在修改变量a引用的对象。