gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:41:49 27 4
gpt4 key购买 nike

Possible Duplicate:
Is Java “pass-by-reference”?

我今天发现了一个不寻常的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 所说,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
}

编辑:在这种情况下,这意味着尽管 voiceSetList 可能会因为这种方法而改变(它可能有一个新的添加到它的元素),对 vsName 的更改将在方法之外不可见。为了防止混淆,我经常标记我的方法参数 final,以防止它们在方法内被重新分配(无论是否意外)。这将使第二个示例完全无法编译。

关于Java 永远不会通过引用传递,对吗?...对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/795160/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com