让我们先来看下面的语句:
- String x = null;
1. 这个语句到底做了些什么?
让我们回顾一下什么是变量,什么是变量值。一个常见的比喻是 变量相当于一个盒子。如同可以使用盒子来储存物品一样,您可以使用一个变量来存储一个值。当声明一个变量时,我们需要设置其类型。
在Java中变量分为两大类型: 原始值(primitive)与引用值(reference).
声明为原始类型的变量,存储的是实际的值;声明为引用类型的变量,存储的是实际对象的地址(指针,引用).
在上面的语句中, 初始化语句定义了一个变量 "x". x中存放的是String引用,此处为 null.
下图对此概念提供了更形象的说明:
如果 x = "abc",则引用示意图如下:
2. 在内存中null具体是什么?
在Java中 null 值是什么,在内存中null是什么?
首先需要明确,null不是一个合法的object实例,所以并没有为其分配内存.
null 仅仅用于表明该引用目前没有指向任何对象。
我们看看 JVM规范 的描述:
- Java虚拟机规范并不强制要求使用一个具体的值编码null。
我认为和其它类C语言一样,null是对引用变量的值全部置0。
译者注: Java对象的属性域默认初始化其实很简单,把分配的内存所有位全部置0,所以 数字是0, boolean是false, 浮点是 0.0f, 引用是 null, 因为引用是内存地址,所以可以推测出 null 实际上就是一堆0. 用鼠标手想一想也就明白, 地址 0 肯定是不可以存放任何对象的。
3. x在内存中存放在何处?
现在我们知道什么是null,并且也知道一个变量就是一个存储位置加上一个相关的符号名(标识符),包含了一些值。那么x存放在内存中的什么地方呢?
通过阅读
JVM 运行时数据区
, 我们知道,既然每个方法都在线程的栈空间中有一个私有的栈帧,那么局部变量就存放在栈帧里面.
补充说明: 如果语句在方法内部,那么x就是局部变量,存放在栈帧之中.
如果在编写不规范的代码中,例如
- private String x = null;
但是将 private 忘记写了,则会从属于对象,分配在堆内存的某个对象内部。
参考文章:
1. Variables, Operators, and Expressions
2. Variable
3. JVM Specifications
相关阅读: