参考,对吗?...对吗?

可能重复:
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?