内存中的“null”在哪里

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

int[5] scores; //bad 

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

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

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

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

所以你可以说变量“指向”无效的堆位置。 或者你可以说变量没有“指向”任何东西。 那时它只是一个语义问题。

我认为这篇文章将回答你的问题 – Java – null变量是否需要内存空间

在Java中,null只是引用(基本上是受限制的指针)可以具有的值。 这意味着参考没有任何意义。 在这种情况下,您仍然占用参考空间。 这是32位系统上的4个字节或64位系统上的8个字节。 但是,在实际分配该类的实例以指向引用之前,您不会为该引用指向的类消耗任何空间。

编辑:就字符串而言,Java中的字符串为每个字符占用16位(2字节),加上少量的簿记开销,这可能是未记录的,并且是特定于实现的。

(记得在链接中提供答案,如果它可以帮助你)

不…你在对象的变量中有一个null(0x00)引用。

我认为“int [5]得分; //差”不是由于内存分配造成的。 请注意,当您声明某些内容时,您通常会声明Type ReferenceName = new Type()。

观察两个例子int [] scores = new int [5]; JLabel label = new JLabel();

类型(在左侧)是int []和JLabel,它们与内存分配无关(指针除外),而新实例(在右侧,需要内存分配)是int [5] ,需要5个整数的空间和JLabel(),不需要参数来调用构造函数,但是内存足够用于JLabel。