【问题标题】:Java uses call by value but weird behavior in case of StringBufferJava 使用按值调用,但在 StringBuffer 的情况下会出现奇怪的行为
【发布时间】:2013-12-28 05:41:51
【问题描述】:

我是 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:-如果这个论坛已经有人问过这个问题,请给我一个链接,因为我找不到它。

【问题讨论】:

  • 你在期待什么,我们无法读懂你的想法!
  • 基本上,你让 y 指向 x,然后使用那个引用,改变内容 y(意思是 x),你实际上根本没有改变 y

标签: java stringbuffer


【解决方案1】:

是的,Java 总是按值传递,但您需要了解值是什么。对于对象,传递的值是对象的引用,而不是对象本身。详细解释见Is Java "pass-by-reference" or "pass-by-value"?


我不知道为什么这会将所有内容都附加在 a 中而不是 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)的引用覆盖对传入的对象(b)的引用

【讨论】:

  • 感谢鲍尔的评论
【解决方案2】:

当你这样做时:

 y = x.append("C");

所有发生的只是使 x 和 y 具有相同的引用(对于 x)。 在那个操作之后你在 y 上所做的一切只是在 x 上做的。 所以,最后这三个操作都发生在 x 上,就像 Matt Ball 说的:

x.append(y);
x.append("C");
x.append("D");

并且x应该是“ABCD”,y不应该改变。

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多