Sea*_*ock 15 c++ java pass-by-reference
我已经阅读了原始数据类型和对象引用按值传递的每个位置?
我试过在谷歌搜索为什么java支持不通过引用传递,但我只是得到java不支持通过引用传递,我找不到它背后的任何原因.
为什么不能通过引用传递原始数据类型?
编辑:大多数人已经关闭了我的问题,假设它是主观的和议论性的.
嗯,它不是,它有一个明确的答案,我的问题是为什么你不能创建一个抽象类的对象,它也不是重复,因为大多数答案只是明确地说不.
谢谢.
duf*_*ymo 14
按设计:
有些人会错误地说对象是"通过引用"传递的.在编程语言设计中,术语传递正确意味着当参数传递给函数时,调用的函数获取对原始值的引用,而不是其值的副本.如果函数修改了它的参数,调用代码中的值将被更改,因为参数和参数在内存中使用相同的插槽.... Java编程语言不通过引用传递对象; 它按值传递对象引用.因为同一引用的两个副本引用相同的实际对象,所以通过一个引用变量所做的更改可以通过另一个引用变量看到.只有一个参数传递模式 - 按值传递 - 这有助于保持简单. - James Gosling等,The Java Programming Language,4th Edition
至于更深层次的原因,这是我的看法:它是两个事实的组合:
如果你不喜欢第一个,我无法帮助你.你必须告诉James Gosling和Bill Joy以及其他设计Java的人他们犯了一个严重的错误.祝你好运.通过几种方法,Java在今天的使用范围远远超过C++.市场虽然不完美,但并没有因为你认为的疏忽而惩罚Java.
在C++中传递值会给开发人员带来负担(例如,赋值和复制构造函数的要求)和编译器编写器(例如,区分堆栈和堆变量,传递值的所有排列和使用const和非const的引用).
除了设计师的品味之外,第二个可能有更多的技术解释.我不是垃圾收集系统的设计和实现方面的专家,但可能因为我不知道的技术原因影响了他们的选择.
我的理解是没有通过引用传递的原因主要是出于安全原因:通过引用传递事物将使函数能够更改超出其范围的东西,这意味着如果我可以替换我的对象(引用)调用恶意函数.
详细说明:在Java中,封装很重要,也是一种安全措施.当一个对象的(指针)给别人写的函数时,我(作为调用者)应该确信我调用的函数只能用我允许它做的那个对象(使用公共成员).允许PBR会在函数完成后让我(作为调用者)处于未知状态,因为我不知道我是在处理自己的对象还是其他东西......