为什么java支持不像C ++那样通过引用传递

我已经读过每个原始数据类型和对象引用按值传递的位置?

我曾尝试在Google中搜索为什么java支持不通过引用传递,但我只是得到java不支持通过引用传递我找不到它背后的任何原因

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

编辑:大多数人已经关闭了我的问题,假设它是主观的和议论性的。

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

谢谢。

按设计:

有些人会错误地说对象是“通过引用”传递的。 在编程语言设计中,术语传递正确意味着当参数传递给函数时,被调用的函数获取对原始值的引用,而不是其值的副本。 如果函数修改了它的参数,则调用代码中的值将被更改,因为参数和参数在内存中使用相同的插槽…. Java编程语言不通过引用传递对象; 它按值传递对象引用。 因为同一引用的两个副本引用相同的实际对象,所以通过一个引用变量进行的更改可通过另一个引用变量可见。 只有一个参数传递模式 – 按值传递 – 这有助于保持简单。 – James Gosling等,The Java Programming Language,4th Edition

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

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

如果你不喜欢第一个,我无法帮助你。 你必须告诉James Gosling和Bill Joy以及其他设计Java的人他们犯了一个严重的错误。 祝你好运。 通过几种方法,Java现在比C ++使用得更广泛。 市场虽然不完美,但并没有因为你认为的疏忽而对Java进行惩罚。

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

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

我的理解是没有通过引用传递的原因主要是出于安全原因:通过引用传递事物将使函数能够更改超出其范围的东西,这意味着如果我可以替换我的对象(引用)呼叫恶意function。

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