翻译人员: 铁锚

翻译时间: 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. CodeBlocks使用小技巧

    1.基本使用: CodeBlocks使用介绍 2.一定要建项目才能编译运行代码吗? 不一定,也可以直接新建文件,直接运行. 如何管理这些未纳入项目的文件?通过左侧Management面板,切换到Fil ...

  2. Spring动态切换多数据源解决方案

    Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...

  3. Servlet常用操作(基础)

    ----------------------------------------------------------------------------------------------[版权申明: ...

  4. 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

    作者:寒小阳 && 龙心尘 时间:2015年11月. 出处: http://blog.csdn.net/han_xiaoyang/article/details/49797143 ht ...

  5. 如何获得Android手机的软件安装列表

    Android的PackageManager类用于检索目前安装在设备上的应用软件包的信息.你可以通过调用getpackagemanager()得到PackageManager类的一个实例.对查询和操作 ...

  6. 微信小程序基本组件概述

    为了更好的理解微信小程序,本文90%文字描述来源于官网的介绍.官网原链接https://mp.weixin.qq.com/debug/wxadoc/dev/component/?t=20161222 ...

  7. Mybatis源码学习之TypeHandler

    ORM框架最重要功能是将面向对象方法中的对象和关系型数据库中的表关联了起来,在关联过程中就必然涉及到对象中的数据类型和数据库中的表字段类型的转换,Mybatis中的org.apache.ibatis. ...

  8. list标准函数的模拟

    ;反序 ( ) -> ( ) (define (rvs x) (let recur ((x x)(res '())) (if (null? x) res (recur (cdr x) (cons ...

  9. Erlang application stop 调用死锁

    Erlang application stop 调用死锁(金庆的专栏)在application行为模块的start()中启动bson应用,在stop()中停止bson,结果application:st ...

  10. win32贪吃蛇实现

    写程序是一个循序渐进的过程,一开始都是加加减减,修修补补,这和我们做企业做创新的原理都是一样的,没有一蹴而就的成功,最近看了周鸿祎的<我的互联网方法论>蛮有启发,分享给大家几句摘抄: 1. ...