【问题标题】:Why is Java pass by value only? [closed]为什么Java只传值? [关闭]
【发布时间】:2014-07-28 21:53:24
【问题描述】:

所以这是另一个值得反对的问题。

我了解 Java 是按值传递的,这意味着什么以及它是如何工作的。所以这不是另一个你能解释什么是传值。我更好奇为什么 Java 不包括通过引用传递?我想这会有用吗?知道巩固我脑海中的推理也会很有帮助....

我讨厌'这是因为它是'场景肯定等同于'因为我这么说'。那么有没有人知道为什么 Java 只包含按值传递?

【问题讨论】:

  • 额外的复杂性和混乱超过了好处。
  • 这不是“因为我这么说”。这是因为吉姆·高斯林这么说的。
  • 推测:这是可能可行的最简单的解决方案。查看允许使用 th ref 或 out 关键字的代码(例如 C#)的语言有多少次?几乎没有,即使你这样做了,你也应该几乎总是把它读作“这个函数有多个返回参数,我懒得包装它,也没有匿名类或动态类,或者我没有理解概念”,而不是“此方法将对您提供的对象图做一些有用和/或破坏性的事情”。
  • 比这更简单。我认为对于不太高级的程序员来说,Java 的做法是最容易理解的,当你在 C# 中编程并且看到 refout 关键字时,你总是需要弄清楚它的作用。我实际上已经看到通过引用获取参数的代码和方法的第一行,只是创建了一个新的。这会创建一个几乎无法调试的应用程序(特别是如果该对象是 LINQ2SQL 实体),除非您想手动单步调试所有这些。
  • 此外,通过使用基于堆栈的值传递模型,方法调用的 JVM 实现大大简化。

标签: java pass-by-value


【解决方案1】:

David Flanagan 撰写的 O'Reilly 的 Java in a Nutshell 说得最好:“Java '通过引用'来操作对象,但它通过值将对象引用传递给方法。”这是 Java 的设计决策。当您传递对象时,您仍然在操作相同的底层对象,因为它们都引用相同的内存位置。因此,我不确定您正在考虑哪些特定场景是您无法使用现有 Java 机制完成的。

【讨论】:

  • 虽然这是唯一实际上没有错误的答案,但它并没有真正解决 OP 的问题,即 为什么
  • 唯一你不能明确地做的是创建int & x的等价物,在程序中的两个不同的地方可以分配给同一个raw int变量并让更改传播。您当然可以通过将int 放入某个容器对象并传递该对象来获得相同的效果,但您不能仅使用基本int(或doublebool 等)来实现.
猜你喜欢
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多