为什么java不支持像C++

2022-09-03 13:48:57

我已经阅读了每个基元数据类型和对象引用按值传递的地方?

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

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

编辑:大多数人都结束了我的问题,假设它是主观的和有争议的。

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

谢谢。


答案 1

按设计:

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

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

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

如果你不喜欢第一个,我忍不住。你必须告诉James Gosling和Bill Joy以及所有其他设计Java的人,他们犯了一个严重的错误。祝你好运。Java的使用范围远远超过今天的C++,有几个方面。市场,无论多么不完美,都没有因为Java你认为的疏忽而受到惩罚。

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

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


答案 2

我的理解是,没有逐个引用的原因主要是出于安全原因:通过引用传递内容将使函数能够更改其范围之外的内容,这意味着如果我调用恶意函数,我的对象(引用)可能会被替换。

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