• 实例说明Java中的null


    翻译人员: 铁锚
    翻译时间: 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

  • 相关阅读:
    linux——进程管理
    linux——软件管理
    linux——压缩打包
    linux——输入输出
    linux——ACL控制
    linux——特殊权限
    linux——基本权限
    linux——用户管理
    单源最短路spfa(队列优化)
    getline读取
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467062.html
Copyright © 2020-2023  润新知