我一直认为 Java 使用 pass-by-reference 。
但是,我看到 一篇博客文章 声称 Java 使用 pass-by-value 。
我不认为我理解他们所做的区分。
解释是什么?
原文由 user4315 发布,翻译遵循 CC BY-SA 4.0 许可协议
我一直认为 Java 使用 pass-by-reference 。
但是,我看到 一篇博客文章 声称 Java 使用 pass-by-value 。
我不认为我理解他们所做的区分。
解释是什么?
原文由 user4315 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
术语“按值传递”和“按引用传递”在计算机科学中具有特殊的、 精确定义 的含义。这些含义与许多人第一次听到这些术语时的直觉不同。这个讨论中的大部分混乱似乎都来自这个事实。
术语“按值传递”和“按引用传递”是指 变量。 按值传递意味着将变量的 值 传递给函数/方法。传递引用意味着对该变量的 引用 被传递给函数。后者为函数提供了一种更改变量内容的方法。
根据这些定义,Java 始终是 按值传递的。不幸的是,当我们处理包含对象的变量时,我们实际上是在处理称为 引用 的对象句柄,它们也是按值传递的。这种术语和语义很容易使许多初学者感到困惑。
它是这样的:
在上面的例子中
aDog.getName()
仍然会返回"Max"
。 The valueaDog
withinmain
is not changed in the functionfoo
with theDog
"Fifi"
as the object reference按值传递。 If it were passed by reference, then theaDog.getName()
inmain
would return"Fifi"
after the call tofoo
.同样地:
在上面的例子中,
Fifi
是调用foo(aDog)
后狗的名字,因为对象的名字是在foo(...)
中设置的foo
在d
--- 上执行的任何操作,出于所有实际目的,它们是在aDog
上执行的,但它的值是 不可能 更改的变量aDog
本身。有关按引用传递和按值传递的更多信息,请参阅以下答案: https ://stackoverflow.com/a/430958/6005228。这更彻底地解释了两者背后的语义和历史,也解释了为什么 Java 和许多其他现代语言在某些情况下似乎同时做这两者。