Java “在哪里?”;空";记忆中

Java “在哪里?”;空";记忆中,java,memory,jvm,initialization,Java,Memory,Jvm,Initialization,在java中,不能在声明中声明数组的大小 int[5] scores; //bad 我被告知这是因为JVM在初始化对象之前不会在内存中分配空间。 如果您有一个实例数组变量(使用默认值null自动初始化),那么该变量是否指向堆中指示null的位置?否…您将在对象的变量中有一个null(0x00)引用。null引用实际上是一个零值。操作系统阻止任何程序访问内存中的零地址,因此JVM将主动检查并确保引用值不是零,然后再允许您访问它。这让JVM给您一个很好的NullPointerException,

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

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

否…您将在对象的变量中有一个null(0x00)引用。

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


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

我想这篇文章会回答你的问题-

在Java中,null只是一个引用(基本上是 受限指针)可以具有。这意味着引用是指 没有什么。在这种情况下,仍然会使用引用的空间。 在32位系统上为4字节,在64位系统上为8字节。 但是,您不会为 引用点,直到您实际分配该引用的实例为止 类将引用指向

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


(如果链接中的答案对您有帮助,请记住向上投票)

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

但在JVM中,对对象的引用更像一个句柄(即表中的索引),null是一个“不可能”的值(表域之外的索引),因此它不能被取消引用,也不会占用此类表中的空间。

我认为“int[5]得分;//bad”不是由于内存分配造成的。 请注意,当您声明某些内容时,实际上是在声明 类型ReferenceName=新类型() 典型的

观察这两个例子 int[]分数=新的int[5]; JLabel标签=新的JLabel()


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

0
。。。例如。。。。NULL(nothing,nada,zippo)你在糟糕的一天打了Harry Flugleman。好吧,那么NULL值就保存在堆栈上的变量中了?是的。JVM将检查何时(以及是否)取消引用,如果为空则引发异常。再看看这个相关的问题,它有一个非常详细的答案:“显然这不是一个有效的地址”-这是不正确的。0是一个完全有效的内存地址。有许多计算平台的地址0是有效的。0是否有效完全取决于硬件和软件(OS)。我理解,但我是在问问题的上下文中说的,在这个上下文中,我们处理的是指向对象(类实例)的指针。一个C++类实例不能驻留在0,因为空指针的全部目的是一个有效指针的“不可能”值,因此将它作为无效/空/未初始化/等来表示。它是OS指定的,是否0是有效的内存地址。