咱们从下面这个简单的语句提及:java
String x = null;
这行代码作了什么?
先回想一下什么叫作变量(variable),什么叫作值(value)。咱们一般把一个变量比喻成一个盒子。咱们能够用盒子来装东西,一样咱们就能够用变量变保存值。定义变量时须要指定变量的类型。
在Java中,有2种主要的数据类型:基本数据类型和引用类型。定义成基本数据类型的变量用来保存值,而定义成引用的变量用来保存引用。因此上面这行代码所作的工做就是,声明了一个变量x,用来存储引用。这里x没有引用任何对象。
下面这张图能更清楚地表达出这一状况:
若是 x = "abc"的话,那么状况就以下图所示:
null在内存里究竟是什么?
首先,null不是一个合法的对象引用,因此系统并无给它分配内存。它仅仅是一个用来代表该引用变量没有引用任何对象的值。
JVM规范中是这么说的:
Java虚拟机规范并无强制规定null应该是什么值。
因此,null究竟是多少,取决于JVM实现厂商。它有可能就像C语言同样实际上是个整数0.
x在内存中是什么呢?
如今咱们已经知道什么是null了。变量实际上是一个存储地址加上一个名字(标识符),能够用来存储一些值。那么 x 到底在内存中的什么位置呢?
在Java中,方法是放在当前线程的内存空间中的栈里的,每个方法都放在这个栈的一个
帧(frame)当中。因此,x就存放在该方法所在的帧里。