【问题标题】:Why doesn't java support pass by reference like C++为什么java不支持像C++这样的引用传递
【发布时间】:2011-07-14 23:32:35
【问题描述】:

我已经阅读了原始数据类型和对象引用按值传递的所有地方?

我曾尝试在 Google 中搜索为什么 java 不支持按引用传递,但 我只得到 java 不支持按引用传递 并且 我找不到任何原因

为什么不能通过引用传递原始数据类型?

编辑:大多数人都认为我的问题是主观的和有争议的。

其实不是,它有一个明确的答案,我的问题是为什么你不能创建一个抽象类的对象,而且它也不是重复的,因为大多数答案只是简单地说不。

谢谢。

【问题讨论】:

  • @duffymo 这不是重复的...OP 知道你不能,并且在问为什么你不能。我不明白为什么这应该被关闭......即使 Java 这样做的原因是主观的,说明原因是主观的将是一个有效的答案。
  • jvm 工作起来很简单,在方法调用时,它会复制堆栈中的参数。由于原语在堆栈上,它只会复制值,引用也是如此。 jvm可以通过传递堆栈偏移量而不是复制来支持这些值的引用传递,但这会使语言以及编译器、实现、反射、优化和大量其他事情变得更加复杂。________所以问题是: 引用传递值得痛苦吗?显然语言设计者认为不是。
  • @duffymo - 这个问题可能是理论上的,但肯定不是主观的,也不是我能看到的重复。
  • 这显然不是主观的。此外,可以给出一个可能有用的答案,解释您实际上如何可以很容易地解决这个限制,所以它根本不是一个限制。所以关闭它的决定是很轻率的,应该重新打开它。

标签: java c++ pass-by-reference


【解决方案1】:

我的理解是,没有通过引用传递的原因主要是出于安全原因:通过引用传递事物将使函数能够更改其范围之外的内容,这意味着我的对象(引用)可能是如果我调用恶意函数,则替换。

详细说明:在 Java 中,封装很重要,也是一种安全措施。当将一个对象(指针)提供给其他人编写的函数时,我(作为调用者)应该确信我调用的函数只能使用该对象执行我允许它执行的操作(使用公共成员)。允许 PBR 会使我(作为调用者)在函数完成后处于未知状态,因为我不知道我是在处理自己的对象还是其他东西......

【讨论】:

  • 所以你是说 C++ 不安全,因为它允许 PBR?很有趣。
  • 也许“危险”这个词更合适,但是是的,恕我直言,C++ 比 Java 危险得多(不仅仅是因为 PBR)。我不是最好的 C++ 程序员,但所有指针和内存管理都不是最安全的编程方式(尽管如此,它更灵活、更快)。但是,我们正在滑入我们都讨厌的“主观”区域......
  • 那里有很多 C++ 代码。我不知道有人因为新调用和删除调用而死亡。我认为这是夸大了危险。
  • 我知道这篇文章与 C# 无关,但我认为值得一提。 C# 要求参数在调用具有传递引用参数的方法时在变量的开头具有“ref”。如果省略,则会出现错误,这将通知方法的用户该参数将通过引用传递,从而使其安全。我希望 Java 也会这样做。
【解决方案2】:

按设计:

有些人会说错 对象是“通过引用”传递的。在 编程语言设计,术语 通过引用正确地表示 当一个参数被传递给一个 函数,被调用的函数得到一个 参考原始值,而不是 其价值的副本。如果函数 修改它的参数,值在 调用代码将被更改 因为参数和参数使用 内存中的相同插槽.... Java 编程语言不通过 引用对象;它通过对象 按值引用。因为两个 同一参考文献的副本指 相同的实际对象,所做的更改 通过一个参考变量是 通过另一个可见。有 正是一种参数传递方式—— 按价值传递——这有助于保持 事情很简单。 -- James Gosling 等人,Java 编程语言,第 4 版

至于更深层次的原因,这是我的看法:这是两个事实的结合:

  1. Gosling 引文的最后一行:“...这有助于保持简单...”
  2. 与 C++ 不同,Java 是通过堆上分配的所有对象进行垃圾收集的。

如果你不喜欢第一个,我没办法。您必须告诉 James Gosling 和 Bill Joy 以及所有其他设计 Java 的人他们犯了一个严重错误。祝你好运。从几个方面来看,Java 今天的使用比 C++ 广泛得多。市场,无论多么不完善,并没有因为你认为的疏忽而惩罚 Java。

C++ 中的按值传递给开发人员(例如,赋值和复制构造函数的要求)和编译器编写者(例如,区分堆栈和堆变量、按值传递的所有排列以及 const 和非 const 引用的所有排列)带来了负担)。

除了设计师的品味之外,第二个可能有更多的技术解释。我不是垃圾收集系统设计和实施方面的专家,但可能出于某种我不知道的技术原因影响了他们的选择。

【讨论】:

  • OP 似乎知道这是设计使然……看来他是专门询问那些更深层的原因。
  • @Michael McGowan 谢谢,至少有人能理解我的问题。
  • 最好联系詹姆斯·高斯林——也许他能解释更深层的原因。
  • @duffymo - 或者 James Gosling 可以发布答案?
  • “你必须告诉 James Gosling 和 Bill Joy 以及所有其他设计 Java 的人他们犯了一个严重错误。” 为什么?我没有看到有人声称这是一个糟糕的设计选择。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2010-11-06
  • 2017-12-28
相关资源
最近更新 更多