• 实例说明Java中的null(转)


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

    [java] view plain copy
     
    1. String x = null;  

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

    图1

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

    图2

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

    [plain] view plain copy
     
    1. Java虚拟机规范并不强制要求使用一个具体的值编码null。  

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

    JVM 运行时数据区 

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

    [java] view plain copy
     
    1. 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
  • 相关阅读:
    MYSQL: 什么是MYSQLD Service
    100 logging模块
    099 hashlib和hmac模块
    098 json和pickle模块
    097 sys模块
    096 os模块
    095 random模块
    094 datetime模块
    093 time模块
    092 模块基础实战之ATM和购物车系统分文件处理
  • 原文地址:https://www.cnblogs.com/heiming/p/7426416.html
Copyright © 2020-2023  润新知