<强>可能重复:结果   是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的行为传递变量,复杂的对象与否,这段代码应该做的正是什么。所以,嗯...我失去了一些东西在这里?有一些细微之处是对失去的我,还是该代码属于上thedailywtf?

有帮助吗?

解决方案

正如Rytmis说,爪哇经过值的引用。这意味着,你可以合法地调用一个方法的参数变异方法,但你不能重新分配他们所期望的价值传播。

示例:

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程序设计教程,通过Deitel公司Deitel公司与第4版:(PG 329)

  

与其它语言不同,Java不允许程序员选择是否通过   每个参数通过值或参考。原始数据类型变量总是传递   按值。对象不会传递给方法;相反,对对象的引用传递给   方法。本身由一个参考值的副本传递的引用传递   到的方法。当一个方法接收到的对象的引用,该方法可以操纵   直接在物体。

在大学学习Java时使用这本书。辉煌参考。

下面是一个很好的文章,解释它。 http://www.javaworld.com/javaworld /javaqa/2000-05/03-qa-0526-pass.html

那么,它可以操纵ArrayList - 这是一个对象...如果要传递围绕一个对象的引用(甚至通过值传递),该对象的变化将反映给调用者。那是问题?

我觉得你是困惑,因为vsName被修改。但在这种情况下,它仅仅是一个局部变量,在准确的同一水平shortenedVoiceSetName。

这不是很清楚,我的代码中的准确的问题是什么。 Java是传址值,但数组传递通过引用,因为他们通过没有对象,但只有三分球!阵列由指针,而不是真正的对象。这使得它们非常快,但也使他们危险的操作。为了解决这个问题,你需要克隆他们得到一份拷贝,而且当时只克隆数组的第一个维度。

有关详细信息,请参阅我的答案在这里:在Java中,什么是浅拷贝?(也看到我的其他答案)

顺便说,也有一些优点阵列仅指针:可以(AB)使用它们作为同步的对象

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top