翻译人员: 铁锚

翻译时间: 2013年11月11日

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

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

String x = null;

1. 这个语句到底做了些什么?

  让我们回顾一下什么是变量,什么是变量值。一个常见的比喻是 变量相当于一个盒子。如同可以使用盒子来储存物品一样,您可以使用一个变量来存储一个值。当声明一个变量时,我们需要设置其类型。

在Java中变量分为两大类型: 原始值(primitive)与引用值(reference).

声明为原始类型的变量,存储的是实际的值;声明为引用类型的变量,存储的是实际对象的地址(指针,引用).

在上面的语句中, 初始化语句定义了一个变量 "x". x中存放的是String引用,此处为 null.

下图对此概念提供了更形象的说明:

图1

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

图2

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


相关阅读:

  1. Java 数组在内存中的结构
  2. Declaration,
    Initialization and Scoping for Java
  3. Notes
    from “Sun Certified Programmer for Java 6 Study Guide”
  4. String
    is passed by “reference” in Java

实例说明Java中的null的更多相关文章

  1. 实例说明Java中的null(转)

    让我们先来看下面的语句: String x = null; 1. 这个语句到底做了些什么?  让我们回顾一下什么是变量,什么是变量值.一个常见的比喻是 变量相当于一个盒子.如同可以使用盒子来储存物品一 ...

  2. Java中有关Null的9件事

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...

  3. 转!!Java中关于Null的9个解释(Java Null详解)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  4. 关于Java中的Null

    什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...

  5. Java中的Null是什么?

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  6. Java中有关Null的9件事(转)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  7. 关于 Java 中的 Null

    什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...

  8. java中的null类型---有关null的9件事

    摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...

  9. JAVA中String = null 与 String = "" 的区别

    JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...

随机推荐

  1. Webpack 2 设置为从当前文件夹逐级向上查找模块

    比较实用, 当你在cd到子文件夹运行webpack时,你可能想要require文件夹js里面的一些模块, 但你又想将祖先的js文件夹作为fallback.这样设置即可: module.exports ...

  2. 安卓高级2 swipeReferenceLayout 使用案例 和完善其自定义上拉

    swipeReferenceLayout 无法完成上来加载数据所以自定义了一个类 Activity.java package qianfeng.com.swipelayoutdemo; import ...

  3. C实战:强大的程序调试工具GDB

    C实战:强大的程序调试工具GDB 1.基本调试 这里只列举最最常用的GDB命令. 1.1 启动GDB gdb program:准备调试程序.也可以直接进入gdb,再通过file命令加载. 1.2 添加 ...

  4. Linux 性能监测:Memory

    这里的讲到的 "内存" 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为 ...

  5. Dynamics CRM Trigger plugin for N:N relationships

    博客原文:https://demystifyingcrm.wordpress.com/2014/12/17/trigger-plugin-for-nn-relationships-in-dynamic ...

  6. OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析

    欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法 ...

  7. 如何将Ubuntu部署到U盘中,用U盘安装linux操作系统

    http://jingyan.baidu.com/article/d5c4b52be79960da560dc59f.html 用U盘装一个linux系统是非常简单的事情,不会就看看这篇文章吧,后期我会 ...

  8. Map俩种遍历方式

    Map本身没有迭代器因而在遍历其中元素时需要采取新的措施,在JDK中提供了俩种方法 keySet Set<K> keySet() 返回此映射中包含的键的 Set 视图.该 set 受映射支 ...

  9. 2.关于QT中的Dialog(模态窗口),文件选择器,颜色选择器,字体选择器,消息提示窗口

     1 新建一个空项目 A 编写 .pro文件 QT += gui widgets HEADERS += \ MyDialog.h SOURCES += \ MyDialog.cpp B 编写MyD ...

  10. TCP连接建立系列 — 客户端接收SYNACK和发送ACK

    主要内容:客户端接收SYNACK.发送ACK,完成连接的建立. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 接收入口 tcp_v4_rcv |--&g ...