28 August 2015

先看下面的声明语句

String = null;

这个声明语句到底做了什么

回想一下,什么是变量?什么是值?一个常见的比喻就是:变量就像是一个盒子,你可以用盒子来存放东西,你可以用变量来存放值。当声明一个变量,我们需要设置它的类型。

Java中主要有两大类:基本数据类型和引用。声明为基本数据类型的变量存储值,声明为引用类型的变量存储引用。上面的表达式中,初始化语句声明一个变量“x”。“x”存储字符串引用。在这里是 null。

看下图可以更清楚的理解这个概念。

pic1

如果是 x = "abc",会像下图所示:

pic2

null在内存中是什么?

null在内存中是什么?或者说Java中的 null是什么?

首先,null不是一个有效的对象实例,所以并没有给它分配内存。它是一个表示对象的引用还没有指向一个对象的值。

JVM规范中:

The Java Virtual Machine specification does not mandate a concrete value encoding null. Java虚拟机规范并没有强制要求一个具体的值编码为空 x 在内存里是什么?

现在我们知道了 null是什么。我们也知道变量是一个储存位置相关的符号名(标示符),它包含了值,x在内存中是什么?

从JVM 运行时数据区的图看来,因为每个方法在线程栈 (thread'stack)中都有私人栈帧 (private stack frame),局部变量就位于这个栈帧中。



blog comments powered by Disqus