内存中的"null"在哪里

Ada*_*dam 6 java memory jvm initialization

在java中,您不能在其声明中声明数组的大小

int[5] scores;  //bad
Run Code Online (Sandbox Code Playgroud)

我被告知这是因为在初始化对象之前,JVM不会在内存中分配空间.如果您有一个实例数组变量(使用默认值null自动初始化),该变量是否指向堆中指示为null的位置?

Str*_*ior 5

空引用实际上是零值。操作系统会阻止任何程序访问内存中的零地址,因此 JVM 会主动检查并确保引用值在允许您访问之前不为零。这让 JVM 给你一个很好的 NullPointerException 而不是“程序执行了非法操作”崩溃。

所以你可以说变量“指向”一个无效的堆位置。或者你可以说变量不“指向”任何东西。在这一点上,这只是一个语义问题。


Fab*_*llo 4

不,因为在 JVM 中不需要这样做。如果您使用母语(例如 C 和 C++),则 NULL 是一个零值的指针,它指向内存基地址。显然这不是一个有效的地址,但无论如何你“可以”取消引用它 - 特别是在没有受保护内存的系统中,例如旧的 MS-DOS 或用于嵌入式处理器的小型内存。并不是说它是一个有效的地址 - 通常该位置包含中断向量,并且您不应该触摸它们。当然,在任何现代操作系统中都会引发保护错误。

但在 JVM 中,对对象的引用更像是句柄(即表中的索引),而 null 是“不可能”值(表域之外的索引),因此无法取消引用并且不占用此类表中的空间。