【问题标题】:Explanation of Java outputJava 输出说明
【发布时间】:2013-01-19 08:12:43
【问题描述】:

代码

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 类修改了String,因此a.append(b) 使String 引用“AB”。

我的问题是如何在函数modify 之外将String a 更改为“AB”,但声明a=b 在函数modify 之外没有影响。 基本上,变量什么时候传值,什么时候传引用?

【问题讨论】:

标签: java output


【解决方案1】:

这是一张简单的图片:

main                            modify

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

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

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

基本答案是 everything 是按值传递的,但在传递对象时,是 reference (按值)传递的,而不是对象本身。 p>

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 2014-06-24
        • 2012-08-12
        • 2017-05-03
        • 1970-01-01
        相关资源
        最近更新 更多