当前位置: 首页 > 面试题库 >

Java永远不会传递引用,对吧?

阴焱
2023-03-14
问题内容

我今天发现了一种不寻常的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,以防止在方法内部重新分配(偶然地或不偶然地)它们。这将完全避免编译第二个示例。



 类似资料:
  • 问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。

  • 问题内容: 我试图比较两个相同类型的对象(在dosHave方法中),但是我从未返回过“ true”。这是我的代码: “ Osoba”类如下所示: 来自主代码: 无论我要使用什么输入,这部分都永远不会发生。“ kartoteka”是我当然进口的包裹。每个类都在单独的程序包中,但是使用它们没有问题。我已经尝试了一段时间,但没有任何帮助,似乎 从来都不是真的,但我不知道为什么。没有Boolean.TRU

  • 我在测试一些短信发送和接收结果应用程序。它按预期发送短信,并祝酒“短信发送”。但它从不祝酒“短信发送”。它也从来没有达到 这意味着从不需要为结果SMS_DELIVERED...知道为什么吗?... Androidanifest.xml

  • 问题内容: 是否可以通过Java通过引用传递对象 就像在C#中一样 问题答案: 不,这在Java中是不可能的。 在Java中,方法的所有参数均按值传递。注意非原始型的的变量,它们是对对象的引用,也由值来传递:在这种情况下, 参考 是 由值来传递 。请注意,按值传递引用与按引用传递不同。

  • 问题内容: 在C ++中,如果需要修改2个对象,则可以按引用传递。您如何在Java中完成此操作?假设这两个对象是基本类型,例如int。 问题答案: 你不能 Java不支持传递对变量的引用。一切都通过价值传递。 当然,当通过值传递对对象的引用时,它将指向同一对象,但这 不是通过reference调用 。

  • 问题内容: 在下一个代码中,我尝试调用deinit方法以释放对该实例的所有引用,但从未调用过deinit。为什么? 问题答案: 适用于Swift的Xcode 不能像常规应用程序一样工作;它们不只运行一次。创建的对象保留在内存中,可以检查直到更改代码为止,此时将重新评估整个操场。发生这种情况时,所有先前的结果都将被丢弃,并且所有对象都将被释放时,您将看不到任何结果。 您的代码是正确的,但是Playg