java的
这个问题在这里已经有了答案:
因为当你打电话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模式上的维基百科。
上一篇: java