Java从来不是按引用传递的,对吧?...右?

2022-08-31 19:42:19

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


答案 1

正如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
}

编辑:在这种情况下,这意味着尽管此方法可能会因方法而更改(可能会向其添加新元素),但 对 的更改在方法外部将不可见。为了防止混淆,我经常标记我的方法参数,以防止它们在方法内部被重新分配(意外或非)。这将使第二个示例完全无法编译。voiceSetListvsNamefinal


答案 2

Java 按值传递引用,因此您将获得引用的副本,但引用的对象是相同的。因此,此方法会修改输入列表。