java NULL 关键字

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

原文链接: What exactly is null in Java?

让我们先来看下面的语句:

String x = null;

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

10160915_BuWO.jpg

如果 x = "abc",则引用示意图如下:

10160915_d0IC.jpg

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

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

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

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

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

转载于:https://my.oschina.net/u/3701483/blog/1843675

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值