【发布时间】:2010-07-02 11:47:31
【问题描述】:
我实际上认为我对 Java 中传递值的实际工作方式有一个很好的了解,因为那是我通过的 SCJP 证书的一部分。直到今天,我在工作中发现了这样一种方法:
public void toCommand(Stringbuffer buf) {
buf.append("blablabla");
}
然后该方法的调用者使用这样的函数:
StringBuffer buf = new StringBuffer();
toCommand(buf);
String str = buf.toString();
现在我认为该代码会给 str 值“”,但实际上它给它的值来自方法。这怎么可能?我认为在 Java 中事情不是这样工作的?
无论哪种方式...用Java编写这样的代码应该被认为是一种不好的做法,对吧?因为我可以想象它会给它带来一些混乱。
我实际上花了一些时间搜索这个,但我对这些消息来源所说的解释是它不应该工作。我错过了什么?
http://www.yoda.arachsys.com/java/passing.html
http://javadude.com/articles/passbyvalue.htm
塞巴斯蒂安
【问题讨论】:
-
你应该在 SCJP 上要求退还你的钱——我相信他们应该教你这个! :-)
-
@mikera +1 这是语言的中心点之一,将对象作为参数传递,我很惊讶他们错过了它。
-
@Taisin:我同意。我从来没有关注过认证,但这只是普通的sad。
-
我很确定他们倾向于使用 String (immutable) 和 Object 类来解决他们的问题。对象没有任何方法可以改变对象的任何内容,所以这可能就是我错过这个细节的原因。我很确定在准备 SCJP 或实际测试时,我从来没有通过这些类型的问题。无论如何,我宁愿在方法中创建缓冲区并返回 buffer.toString,而不是发送 StringBuffer 作为参数。但也许这并不是在所有情况下都是最佳的,比如在组装电子邮件时,正如有人提议的那样。
-
@sebastianlarsson 实际上,您必须在认证后提出这样的问题这一事实说明了很多认证价值。问题是,这不是细节,而是语言的关键点。令人惊讶的是,他们在问题中错过了它。顺便说一句,当文本操作被分成几种方法时,将 StringBuffer 作为参数发送是一个很好的做法——如果你,f.ex,通过许多对象、继承等组合状态报告。节省内存。字符串操作很繁重。