Java永远不会通过引用传递,对吗?

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
}

编辑:在这种情况下,这意味着尽管voiceSetList可能会因为这个方法而发生更改(它可能添加了一个新元素),但是对vsName的更改在方法之外是不可见的。为了避免混淆,我经常将我的方法参数标记为final,这样可以防止在方法内部重新分配(意外或非意外)。这将使第二个示例根本无法编译。


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


好吧,它可以操纵ArrayList——这是一个物体……如果要传递一个对象引用(甚至是通过值传递),对该对象的更改将反映到调用方。这就是问题吗?


我觉得你很困惑,因为vsname被修改了。但在本文中,它只是一个局部变量,与shorteedVoiceSetName的级别完全相同。


我不清楚代码中的确切问题是什么。Java是按值传递的,但是数组是按引用传递的,因为它们传递的不是对象,而是指针!数组由指针组成,不是真正的对象。这使他们非常快,但也使他们危险的处理。要解决这个问题,您需要克隆它们以获得一个副本,即使这样,它也只克隆数组的第一个维度。

有关更多细节,请参见我的答案:在Java中,什么是浅拷贝?(另请参阅我的其他答案)

顺便说一下,由于数组只是指针,所以有一些优势:您可以(AB)将它们用作同步对象!