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

时间:2011-03-14 12:13:29

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

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

我曾尝试在Google中搜索为什么java支持不通过引用传递,但我只得到java不支持通过引用传递我找不到任何理由

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

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

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

感谢。

2 个答案:

答案 0 :(得分:14)

按设计:

  

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

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

  1. Gosling引文的最后一行:“......这有助于保持简单......”
  2. 与C ++不同,Java是在堆上分配的所有对象的垃圾收集。
  3. 如果你不喜欢第一个,我无法帮助你。你必须告诉James Gosling和Bill Joy以及其他设计Java的人他们犯了一个严重的错误。祝你好运。通过几种方法,Java在今天的使用范围远远超过C ++。市场虽然不完美,但并没有因为你认为的疏忽而对Java进行惩罚。

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

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

答案 1 :(得分:6)

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

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