Java 中 Boolean 和 boolean的区别

  • Post author:
  • Post category:java


​上次一个同学问,

Boolean

类型的值不是只有

true



false

两种吗?为什么他定义的属性出现了

null

值?

我们应该先明确一点,

boolean



Java

的基本数据类型,

Boolean



Java

的一个类。

boolean

类型会在“赋零值”阶段给属性赋

false

。而

Boolean

是一个类,会在“赋零值”阶段给对象赋

null

如果是静态属性,会在类加载时被赋值。如果是普通类属性,会在实例化对象时赋值。这两点可以了解一下“类加载机制”和“对象创建过程”。



类加载机制:
  • 加载:根据类的全名获取类的二进制字节流,将类加载进内存并在堆中生成一个代表这个类的

    Class

    对象,作为方法区数据的访问入口

  • 验证:验证

    class

    文件中的字节流是否符合

    JVM

    规范

  • 准备:在方法区中为类的静态属性分配内存,并初始化默认值(

    boolean

    的默认值是

    false



    Boolean

    的默认值是

    null

  • 解析:将常量池中的符号引用转化为直接引用,可以理解为对象引用转成指针

  • 初始化:真正开始执行类中的代码,静态属性赋值和静态块



对象实例化过程:
  • 检查类是否已经被加载(双亲委派)

  • 给对象分配内存空间(指针碰撞)

  • 零值初始化(

    false / null

  • 设置对象头(对象分代年龄等信息)

  • 执行

    <init>

    方法(属性初始化,语句块和构造方法)

所以说,Boolean只是被加载了,还没有被实例化,在被实例化之前并没有分配内存,所以是

null



接下来我们可以看看

Boolean

的属性和构造方法,了解一下它如何包装

boolean

// final boolean类型的属性,通过构造方法注入值
private final boolean value;// 构造方法 Boolean a = true 实际上就是调用这个方法
public Boolean(boolean value) {
    this.value = value;
}// 构造方法
public Boolean(String s) {
    this(parseBoolean(s));
}

对于其他的属性和方法,可以自行查看都比较简单

关于 Boolean 使用过程中有一个风险点,阿里巴巴开发手册也写得非常好

ali

简单来说就是,boolean 定义的属性一定要有值,如果

Boolean

对象值为

null

,解包过程中就会出现NPE。

想象一种场景:你女票问你:你爱我吗?但你没听清。如果你是

Boolean

就会回答,我没听清(

null

),如果你是

boolean

就会回答,不爱了 (false)

之后就会有个狗头被打爆。

interesting



版权声明:本文为mkii_hong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。