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

Sea*_*ock 15 c++ java pass-by-reference

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

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

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

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

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

谢谢.

duf*_*ymo 14

按设计:

有些人会错误地说对象是"通过引用"传递的.在编程语言设计中,术语传递正确意味着当参数传递给函数时,调用的函数获取对原始值的引用,而不是其值的副本.如果函数修改了它的参数,调用代码中的值将被更改,因为参数和参数在内存中使用相同的插槽.... 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的引用).

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

  • OP似乎知道这是设计......似乎他特别要求更深层次的理由. (3认同)

Nir*_*evy 6

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

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

  • 我知道这篇文章不是关于C#,但我认为值得一提.当调用带有pass-by-reference参数的方法时,C#要求参数在变量的开头有"ref".如果省略,则会出现错误,这将通知用户该方法将通过引用传递参数,从而使其安全.我希望Java也会这样做. (5认同)