为什么java不支持指针?

时间:2012-03-07 04:00:32

标签: java

  

可能重复:
  Why can't we use pointers in Java?

我想知道java中是否有任何指针概念?

我知道没有明确的指针声明,但实现了implcitly指针概念。为什么java中没有指针

5 个答案:

答案 0 :(得分:9)

你必须区分指针的几种用法:

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

因此整体Java没有指针(在C / C ++意义上),因为它不需要它们用于通用OOP编程。此外,添加指向Java的指针会破坏安全性和健壮性,并使语言更加复杂。

答案 1 :(得分:3)

如果你问为什么没有直接访问内存位置,那就是为了保证内存访问的安全性。无论程序员多么无能(并且管理的内存对于程序员来说非常方便,无论多么称职),都不会再出现段错误和缓冲区溢出。

如果你问为什么没有传递引用或函数指针,那么有一些解决方法可以与其他构造实现相同的效果。

答案 2 :(得分:2)

您只需要查看人们询问导致SIGSEGV的C指针或导致EXC_BAD_ACCESS的Objective-C指针的问题比例(例如SO): - )

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

答案 3 :(得分:1)

  

问:java中是否有任何指针概念?

答:是的。他们被称为“参考”。

  

问:但是实现了implcitly指针概念......这里没有明确的指针声明

答:正确。

“安全”是通常给出的一个原因。

但更重要的原因是“抽象程度”。如果Java“隐藏”实现细节(例如,如何在内存中布置数组),则可以自由地“优化”事物(比如为您提供查询数组长度的标准方法 - C / C ++无法直接执行的操作) 。它可以自由地实现“垃圾收集”。对于这些 - 以及更多 - 机会,这门语言和运行时间都可以自由利用。

仅供参考,这是一个相反的观点:

答案 4 :(得分:1)

这不是一个简单的答案的简单问题,但这里是它的要点。

Java没有给程序员直接访问内存,因此没有指针没有malloc没有free realloc等。这是为了安全起见,它保护程序员不被篡改(至少在Java的脑海中)他们不应该“T