java的

这个问题在这里已经有了答案:

  • Java是“通过引用传递”还是“按值传递”? 78个答案

  • 因为当你打电话speak(name); ,当你做的时候,里面会说话

    name = name.concat("4");
    

    它创建一个新的对象,因为String是不可变的。 当你改变原始字符串时,它会创建一个新的对象,我同意你正在返回它,但你没有捕捉到它。

    所以基本上你在做什么是:

    name(new) = name(original) + '4'; // but you should notice that both the names are different objects.
    

    尝试

    String name = "Sam";
    name = speak(name);
    

    当然,现在我认为没有必要解释为什么它与StringBuilder一起工作,除非你不知道StringBuilder是可变的。


    查看String的Javadoc,你会发现

    [...]字符串对象是不可变的 [...]。

    这意味着concat(String)不会更改String本身,而是构造一个新的String

    另一方面, StringBuilder是可变的。 通过调用append(CharSequence) ,对象本身发生了变异。


    好的, speak方法在做什么?

    首先,

    name.concat("4");
    

    创建与"4"连接的name相同的新对象。

    所以,线

    name = name.concat(4);
    

    重新定义本地 (用于speak方法)变量name

    然后你用这个返回这个新值的引用

    return name;
    

    因此,在方法内传递的原始变量不会被修改,但该方法会返回修改后的值。

    test方法中,您实际上修改变量而不修改引用( StringBuilder类是可变的,因此如果可以修改此类型,则是可变的)。

    然后我们会看到另一个问题:为什么StringBuilder.append返回值,它看起来多余。 这个问题的答案在于“建造者”模式的描述,为此它是实现修改方法的常用方式。 请参阅Builder模式上的维基百科。

    链接地址: http://www.djcxy.com/p/3511.html

    上一篇: java

    下一篇: Java Incremental operator query (++i and i++)