1

代码

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并且我也知道StringBuffer类会就地修改字符串,因此a.append(b)使字符串引用“AB”。

我的问题是如何String a在函数外更改为“AB”,modify但语句在函数a=b外没有影响modify基本上,变量何时通过值传递,何时通过引用传递?

4

3 回答 3

2

Java始终使用按值传递。在引用的情况下,它是引用的值。传递引用时,可以更改引用所引用的对象,但分配给其他对象的引用没有任何后果。

因此,在您的情况下,a可以更改引用的对象,但不能将引用分配给其他对象(可以这样,但没有效果)。

于 2013-01-19T08:14:00.620 回答
2

这是一张简单的图片:

main                            modify

StringBuffer <------a           a
     ^                          |
     +--------------------------+

StringBuffer <------b           b
     ^                          |
     +--------------------------+

main中,ab都是指向单独的 StringBuffer 实例的引用。main调用时modify,它传递引用的副本ab(按值传递)。 modify可以改变 StringBuffer 实例的内容,但如果改变 and 的值ab它只对自己的本地副本进行操作,不会影响main'ab指向的内容。

基本答案是一切都按值传递,但是在传递对象时,传递的是引用(按值),而不是对象本身。

于 2013-01-19T08:26:33.320 回答
0

包含对象的变量实际上是对该对象的引用。因此,如果将其分配给另一个变量,则两个变量都引用同一个对象。

当您将变量传递给函数时,值将被传递。

在对象的情况下,传递的值是引用。

所以,你可以在 modify 中将 b 赋值给 a,但效果是引用 b 的本地值,之后它们都是一样的,并且引用对象 b。当您将 b 附加到 a 时,您正在修改变量 a 引用的对象。

于 2013-01-19T08:30:04.063 回答