为什么Java不支持指针?

6

可能是重复问题:
为什么Java不能使用指针?

我想知道Java中是否有指针概念?

我知道Java中没有显式声明指针,但隐含地实现了指针概念。为什么Java中没有指针呢?


6
为什么麦当劳没有披萨? - Raptor
你需要关于指针的什么信息? 定义一个指针。 - Sarel Botha
5个回答

10

您需要区分指针的几种用途:

  • 通过指针算术进行内存访问 - 这基本上是不安全的。Java具有强大的安全模型,因此禁止使用指针算术。JVM无法确保包含指针算术的代码是安全的,除非进行昂贵的运行时检查。除非您编写极低级别的代码(在这种情况下,您应该使用汇编语言或C / C ++),否则您不需要指针算术。
  • 通过指针偏移访问数组 - Java通过索引数组访问来实现这一点,因此您不需要指针。 Java索引数组访问的一个重要优点是它检测并禁止越界访问,这可能是错误的主要来源。这通常值得支付微小的运行时开销。
  • 对象引用 - Java具有此功能,只是没有将其称为指针。任何普通对象引用都可以作为其中之一。当您执行 String s="Hello"; 时,您实际上获得了对字符串对象的指针。
  • 按引用传递参数,即传递一个允许您更改调用者范围内变量值的引用 - Java没有这个功能,但这是一个相当罕见的用例,并且可以轻松以其他方式完成。总的来说,这等同于在调用者和被调用者都可以看到的对象作用域中更改字段。
  • 手动内存管理 - 您可以使用指针手动控制和分配内存块。这对某些应用程序(游戏,设备驱动程序)非常有用,但对于通用OOP编程而言,这根本不值得付出努力。相反,Java提供了非常好的自动垃圾收集器,负责为您进行内存管理。这是一件非常好的事情:对于许多之前被迫在Pascal / C / C ++中处理手动内存管理的人来说,这是Java推出时最大的优势之一。

因此,总体来说,Java没有指针(在C / C ++意义上),因为它不需要它们进行通用OOP编程。此外,向Java添加指针将破坏安全性和强度,并使语言更加复杂。


3

如果你问为什么不能直接访问内存地址,那是为了保证内存访问的安全性。无论编程人员多么不称职,都不会再出现segmentation faults和缓冲区溢出问题(而且对于程序员来说,管理内存也非常方便,无论他们有多么能干)。

如果你问为什么不能传递引用或函数指针,那么可以使用其他结构来实现相同的效果。


2

你只需要看一下人们在stackoverflow上关于C指针导致SIGSEGV或Objective-C指针导致EXC_BAD_ACCESS的问题所占比例,就能明白。

Java 指针,只是不称之为指针(除了可疑命名的NullPointerException)。它提供几乎相同的功能,但以更安全的方式实现,例如防止您将其设置为任意值。


1
问:Java中是否有指针概念?
答:有。它们被称为“引用”。
问:但是隐式指针概念是实现的,这里没有显式声明指针。
答:正确。
“安全性”通常是给出的一个原因。但更重要的原因是“抽象级别”。如果Java“隐藏”实现细节(例如数组在内存中的布局方式),它就可以自由地“优化”事情(比如给你一个标准的方式来查询数组长度——C/C++不能直接做到这一点)。它可以实现“垃圾回收”。大门突然敞开了,语言和运行时可以充分利用这些——以及许多其他——机会。
只是提供一个相反的观点。

1

这不是一个简单的问题,也没有简单的答案,但以下是要点。

Java不直接给程序员访问内存的权限,因此没有指针、malloc、free、realloc等。这是出于安全考虑,它保护程序员免受篡改(至少在Java看来)他们不应该接触的东西的影响。


“…这就是它的要点” - 这是一个拼写错误还是一个巧妙的元笑话?(提示:在字典中查找“jest”和“jist”)。 - Stephen C
实际上我写了“jist”,但是Firefox指出它的拼写是错误的。 - twain249
我的错误。正确的拼写是“gist”。 - Stephen C
因此Firefox一直在向我发出警告。已修复。 - twain249
1
火狐浏览器变黄了?开玩笑吧! - paulsm4
请不要叫我雪莉... - DNA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接