Java是从来没有过,通过引用,对不对?......是吗? [重复]
-
18-09-2019 - |
题
<强>可能重复:强>结果 是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)使用它们作为同步的对象
!