java是否存在引用传递_Java永远不会传递引用,对吧?

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

可能重复:

Java是“按引用传递”吗?

我今天发现了一个不寻常的Java方法:

private void addShortenedName(ArrayList 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?

6个解决方案

105 votes

正如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,以防止在方法内部重新分配(偶然地或非偶然地)它们。 这将完全避免编译第二个示例。

Michael Myers answered 2020-07-01T23:26:49Z

28 votes

Java按值传递引用,因此您可以获得引用的副本,但是被引用的对象是相同的。 因此,此方法确实修改了输入列表。

Rytmis answered 2020-07-01T23:27:09Z

3 votes

引用本身按值传递。

来自Deitel和Deitel的Java How to Program,4th Edition:(第329页)

与其他语言不同,Java不允许程序员选择是否通过 每个参数都按值或引用。 原始数据类型变量始终被传递 按价值。 对象不传递给方法。 而是将对对象的引用传递给 方法。 引用本身按值传递-传递引用的副本 一种方法。 当方法接收到对对象的引用时,该方法可以进行操作 直接对象。

在大学学习Java时曾用过这本书。 辉煌的参考。

这是一篇很好的文章解释。[http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html]

the_new_mr answered 2020-07-01T23:27:48Z

2 votes

好吧,它可以操纵ArrayList-这是一个对象...如果传递对象引用(甚至按值传递),则对该对象的更改将反映给调用者。 这是问题吗?

Marc Gravell answered 2020-07-01T23:28:08Z

1 votes

我认为您很困惑,因为vsName被修改了。 但是在这种情况下,它只是一个局部变量,与shortedVoiceSetName处于完全相同的级别。

PhiLho answered 2020-07-01T23:28:28Z

-2 votes

我不清楚代码中的确切问题是什么。 Java是按值传递的,但是数组是按引用传递的,因为它们不传递对象,而仅传递指针! 数组由指针组成,而不是实际对象。 这使它们非常快,但也使它们操作起来很危险。 要解决此问题,您需要克隆它们以获取副本,即使那样,它也只会克隆数组的第一个维度。

有关更多详细信息,请参见我的回答:在Java中,什么是浅表副本? (另请参阅我的其他答案)

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

mark answered 2020-07-01T23:28:57Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值