java NULL 关键字

翻译人员: 铁锚
翻译时间: 2013年11月11日html

原文连接: What exactly is null in Java?java

让咱们先来看下面的语句:算法

String x = null;

1. 这个语句到底作了些什么?
  让咱们回顾一下什么是变量,什么是变量值。一个常见的比喻是 变量至关于一个盒子。如同可使用盒子来储存物品同样,您可使用一个变量来存储一个值。当声明一个变量时,咱们须要设置其类型。
在Java中变量分为两大类型: 原始值(primitive)与引用值(reference).
声明为原始类型的变量,存储的是实际的值;声明为引用类型的变量,存储的是实际对象的地址(指针,引用).
在上面的语句中, 初始化语句定义了一个变量 "x". x中存放的是String引用,此处为 null.
下图对此概念提供了更形象的说明:安全

若是 x = "abc",则引用示意图以下:oracle

2. 在内存中null具体是什么?
在Java中 null 值是什么,在内存中null是什么?
首先须要明确,null不是一个合法的object实例,因此并无为其分配内存. 
null 仅仅用于代表该引用目前没有指向任何对象。
咱们看看 JVM规范 的描述:jvm

The Java Virtual Machine specification does not mandate a concrete value encoding null.编码

Java虚拟机规范没有强制要求编码null的具体值。spa

我认为和其它类C语言同样,null是对引用变量的值所有置0。
译者注: Java对象的属性域默认初始化其实很简单,把分配的内存全部位所有置0,因此 数字是0, boolean是false, 浮点是 0.0f, 引用是 null, 由于引用是内存地址,因此能够推测出 null 实际上就是一堆0. 用鼠标手想想也就明白, 地址 0 确定是不能够存听任何对象的。
3. x在内存中存放在何处?
如今咱们知道什么是null,而且也知道一个变量就是一个存储位置加上一个相关的符号名(标识符),包含了一些值。那么x存放在内存中的什么地方呢?
经过阅读   .net

JVM 运行时数据区 

 咱们知道,既然每一个方法都在线程的栈空间中有一个私有的栈帧,那么局部变量就存放在栈帧里面.
补充说明: 若是语句在方法内部,那么x就是局部变量,存放在栈帧之中.
若是在编写不规范的代码中,例如 线程

可是将 private 忘记写了,则会从属于对象,分配在堆内存的某个对象内部。
 

1. null设计初衷: 是为了表示一些缺失的东西,例如缺失的用户、资源或其余东西。

2. null是Java中的关键字,像public、static、final。它是大小写敏感的。

3. Java中的任何引用变量都将null做为默认值。

4. null既不是对象也不是一种类型,它仅是一种特殊的值,你能够将其赋予任何引用类型,但不能将null赋给基本类型变量。你也能够将null转化成任何类型。

5. 可是若是将null赋值给包装类object,而后将object赋给各自的基本类型,编译器不会报,可是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱致使的。

6. 任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。

7. 若是使用了带有null值的引用类型变量,instanceof操做将会返回false。这是instanceof操做一个很重要的特性,使得对类型强制转换检查颇有用。

8. 你可能知道不能调用非静态方法来使用一个值为null的引用类型变量。它将会抛出空指针异常,可是你可能不知道,你可使用静态方法来使用一个值为null的引用类型变量。由于静态方法使用静态绑定,不会抛出空指针异常。

9. 你能够将null传递给方法使用,这时方法能够接收任何引用类型,例如public void print(Object obj)能够这样调用print(null)。从编译角度来看这是能够的,但结果彻底取决于方法。Null安全的方法,如在这个例子中的print方法,不会抛出空指针异常,只是优雅的退出。若是业务逻辑容许的话,推荐使用null安全的方法。

10. 你可使用==或者!=操做来比较null值,可是不能使用其余算法或者逻辑操做,例如小于或者大于。跟SQL不同,在Java中null==null将返回true

原文地址:http://mp.weixin.qq.com/s/PTBS9rgb1EVQtaRD3rB_uA

相关文章
相关标签/搜索