Java is NEVER pass-by-reference, right?…right?
Possible Duplicate:
Is Java"pass-by-reference"?
今天的发现:西安寻常的Java方法P></
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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' S for about or not复合对象通过变量this should do,确切的说因为是没有尾巴的。我知道我失踪的东西在这里...am?subtlety is there was some that does this or我失去的尾巴上,属于thedailywtf在线?P></
正如Rytmis所说,Java通过值传递引用。这意味着可以对方法的参数合法地调用可变方法,但不能重新分配它们并期望值传播。
例子:
1 2 3 4 5 6 | 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 } |
编辑:在这种情况下,这意味着尽管
Java通过值传递引用,因此获得引用的副本,但引用的对象是相同的。因此,此方法确实修改了输入列表。
引用本身按值传递。
从Java如何编程,第四版Deelel&DeTel:(PG 329)
Unlike other languages, Java does not allow the programmer to choose whether to pass
each argument by value or by reference. Primitive data type variables are always passed
by value. Objects are not passed to methods; rather, references to objects are passed to
methods. The references themselves are passed by value—a copy of a reference is passed
to a method. When a method receives a reference to an object, the method can manipulate
the object directly.
在大学学习Java时使用了这本书。精彩的参考。
这是一篇很好的文章。http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
好吧,它可以操纵
我觉得你很困惑,因为vsname被修改了。但在本文中,它只是一个局部变量,与shorteedVoiceSetName的级别完全相同。
我不清楚代码中的确切问题是什么。Java是按值传递的,但是数组是按引用传递的,因为它们传递的不是对象,而是指针!数组由指针组成,不是真正的对象。这使他们非常快,但也使他们危险的处理。要解决这个问题,您需要克隆它们以获得一个副本,即使这样,它也只克隆数组的第一个维度。
有关更多细节,请参见我的答案:在Java中,什么是浅拷贝?(另请参阅我的其他答案)
顺便说一下,由于数组只是指针,所以有一些优势:您可以(AB)将它们用作同步对象!