Java中的指针

Java中的指针,java,pointers,memory,Java,Pointers,Memory,C++支持指针,而Java不支持。但是当许多程序员质疑没有指针如何工作时,发起人开始说“受限指针”。所以我们可以说Java支持受限指针?这里的术语很模糊 Java支持它所称的“引用”。引用的作用非常类似于C/C++语言中的指针。它们的作用与这些语言中“引用”的作用方式不同 C中的指针和Java中的引用之间的主要区别是: 您不能在Java中执行指针算术(即,您不能从Java引用中“添加”或“减去”,您只能取消引用它或将它与另一个进行比较) 不能将其转换为不兼容的类型:Java是强类型安全的,不能

C++支持指针,而Java不支持。但是当许多程序员质疑没有指针如何工作时,发起人开始说“受限指针”。所以我们可以说Java支持受限指针?

这里的术语很模糊

Java支持它所称的“引用”。引用的作用非常类似于C/C++语言中的指针。它们的作用与这些语言中“引用”的作用方式不同

C中的指针和Java中的引用之间的主要区别是:

  • 您不能在Java中执行指针算术(即,您不能从Java引用中“添加”或“减去”,您只能取消引用它或将它与另一个进行比较)
  • 不能将其转换为不兼容的类型:Java是强类型安全的,不能将内存中的字节“重新解释”为其他对象
对于指针的某些用法,这没有实际效果(例如,在两种语言中,链表的工作原理几乎相同),而对于其他语言,差异非常大(C中的数组只是花哨的指针算法,在Java中它们的工作原理完全不同)

因此,Java引用在某种程度上可以称为“受限指针”

作为

…一种编程语言数据类型,其值直接引用(或“指向”)另一个值

根据这个严格的定义,Java没有指针


更一般的是指针的超类,但也反对更抽象的东西,如文件句柄甚至URL。

首先,您需要了解“受限指针”。摘录自:

指针的一个主要问题是,只要它们可以 直接作为一个数字操纵,它们可以指向未使用的 用于其他目的的地址或数据。许多 语言,包括大多数函数式编程语言和最新的 像Java这样的命令式语言用更不透明的 引用的类型,通常简称为引用 只能用于引用对象,不能作为数字进行操作, 防止这种类型的错误。数组索引作为特殊的 案例

它的意思是,在Java中,不能对指针进行加减操作,因为内存管理是由JVM本身完成的


采用Java。引用有类型,就像在C中一样,它们是类型安全的,因为这些引用不能被解释为原始地址,不允许不安全的转换。

Java有指针。这就是为什么它有NullPointerException。它只是没有指针数学。任何对对象的引用实际上都是指针,这就是为什么它可以空。也就是说,有很多有用的编程语言没有指针,因此任何认为编程需要指针的人对编程语言的看法都非常狭隘。

Java和C/C++之间的另一个重要区别是引用是对象的索引。而在C/C++中,指针是addr记忆中的悲伤

在32位JVM中,它们是相同的,但在64位JVM中它们不是。您会注意到这一差异的地方是,对于小于32 GB的堆大小,引用仍然是32位的(即使在64位JVM中也是如此),这是因为对象分配在8字节边界上,因此索引最多可以引用32 GB的内存(4 G*8字节)

在64位C/C++程序中,指针需要能够引用每个字节,即使内存分配在16字节的边界上,因此它的大小为64位(从技术上讲,对于小于4 GB的内存,应该可以将其设置为32位)

A需要两个底层指针(总共16个字节),但在gcc上,引用计数的最小分配大小是32字节(然后是指向的对象的大小),总大小是32字节+每个指针16字节。在Java中,每个引用的c.f.4字节。(如果堆的大小为32+GB,则为8字节)

总之,Java引用不必是实际地址,甚至不必与指针大小相同。它肯定比智能指针小得多。

请允许我这样说: Java没有指针,因为它的设计者决定以不同的方式调用它们。
事实上,他们移动了堆上的所有内容,以便所有内容都由指针管理,然后,由于不再存在直接引用,因此取消了“.”,并将“->”重命名为“.”

当人们说Java不支持指针时,他们正在练习 Java调用的引用完全对应于 过去一直被称为指针

Java不支持的是指针算法 就我所知,C和它的后代是唯一的 支持指针运算的类型化语言。Pascal和Modula-2, 例如,有“指针”,在它们的 规范,但这些指针的语义更接近 Java引用;它们不允许指针算术。

关于这件事,有这样的说法:

Java语言规范§4.3.1
引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它不引用任何对象

对于那些害怕钻研文档的人来说,例如Java的
NullPointerException
的出现应该是Java确实有指针的有力迹象

简言之,这个问题毫无意义,因为它基于一个完全错误的假设,即引用OP,“Java没有指针”——如上所述,这在技术上是胡说八道

另见

这个答案可以被看作是对詹姆斯答案的必要参考


干杯。

指针只是一种实现多重返回的方法。它们对于有效的工作来说并不重要。它比指针更易于使用,并且您可以更好地理解代码。在