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