Java输出的说明

时间:2013-01-19 08:12:44

标签: java output

代码

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之外没有影响。 基本上,当变量按值传递时,何时按引用?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

这是一张简单的图片:

main                            modify

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

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

main中,ab都是指向单独的StringBuffer实例的引用。当main调用modify时,它会传递引用ab副本(按值传递)。 modify可以更改StringBuffer实例的内容,但是如果它更改了ab的值,它只能在自己的本地副本上运行,不会影响{{1} } maina指向。

基本答案是所有按值传递,但传递对象时,它是传递的引用(按值),而不是对象本身。

答案 2 :(得分:0)

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

将变量传递给函数时,会传递值。

对于对象,传递的值是引用。

因此,您可以将b分配给in in,但效果是参考b的本地值,之后它们都是相同的并且引用对象b。将b附加到a时,您正在修改变量a引用的对象。