参考,对吗?...对吗?
可能重复:
Java是否“通过引用”?
我今天发现了一种不寻常的Java方法:
private void addShortenedName(ArrayList<String> voiceSetList, String vsName)
{
if (null == vsName)
vsName = "";
else
vsName = vsName.trim();
String shortenedVoiceSetName = vsName.substring(0, Math.min(8, vsName.length()));
//SCR10638 - Prevent export of empty rows.
if (shortenedVoiceSetName.length() > 0)
{
if (!voiceSetList.contains("#" + shortenedVoiceSetName))
voiceSetList.add("#" + shortenedVoiceSetName);
}
}
根据我读过的有关Java传递变量,复杂对象的行为的一切,这段代码应该完全不做任何事情。 所以呃...我在这里错过了什么? 有没有在我身上丢失一些微妙之处,或者这个代码属于dailywtf?
正如Rytmis所说,Java通过价值传递参考。 这意味着你可以合法地调用方法参数上的变异方法,但是你不能重新分配它们并期望值传播。
例:
private void goodChangeDog(Dog dog) {
dog.setColor(Color.BLACK); // works as expected!
}
private void badChangeDog(Dog dog) {
dog = new StBernard(); // compiles, but has no effect outside the method
}
编辑:这意味着在这种情况下,虽然voiceSetList
还不如这个方法的结果而改变(它可能已添加到一个新的元素),更改到vsName
不会是方法的外部可见。 为了防止混淆,我经常将我的方法参数标记为final
,这使得它们不会被重新分配(意外或不是)在方法内部。 这将保持第二个例子不被编译。
Java通过值传递引用,所以你得到了引用的副本,但引用的对象是相同的。 因此这个方法确实修改了输入列表。
引用本身是通过值传递的。
从Java如何编程,第4版Deitel和Deitel:(第329页)
与其他语言不同,Java不允许程序员选择是通过值还是通过引用来传递每个参数。 原始数据类型变量总是按值传递。 对象不会传递给方法; 相反,对象的引用被传递给方法。 引用本身通过值传递 - 引用的副本传递给方法。 当方法接收到对象的引用时,该方法可以直接操作对象。
在大学学习Java时使用这本书。 辉煌的参考。
这是一篇很好的文章解释它。 http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
链接地址: http://www.djcxy.com/p/3499.html上一篇: reference, right?...right?
下一篇: Are arrays passed by value or passed by reference in Java?