​上次一个同学问,Boolean 类型的值不是只有 truefalse 两种吗?为什么他定义的属性出现了 null 值?

我们应该先明确一点,booleanJava 的基本数据类型,BooleanJava 的一个类。boolean 类型会在“赋零值”阶段给属性赋 false。而 Boolean 是一个类,会在“赋零值”阶段给对象赋 null

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

类加载机制:
  • 加载:根据类的全名获取类的二进制字节流,将类加载进内存并在堆中生成一个代表这个类的 Class 对象,作为方法区数据的访问入口

  • 验证:验证 class 文件中的字节流是否符合 JVM 规范

  • 准备:在方法区中为类的静态属性分配内存,并初始化默认值(boolean 的默认值是 falseBoolean 的默认值是 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 使用过程中有一个风险点,阿里巴巴开发手册也写得非常好

简单来说就是,boolean 定义的属性一定要有值,如果 Boolean 对象值为 null,解包过程中就会出现NPE。

想象一种场景:你女票问你:你爱我吗?但你没听清。如果你是 Boolean 就会回答,我没听清(null),如果你是 boolean 就会回答,不爱了 (false)

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

Java 中 Boolean 和 boolean的区别相关推荐

  1. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  2. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

  3. java 中long和Long的区别

    转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...

  4. Java中Long和long的区别

    转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...

  5. java中的异常种类和区别以及处理机制和区别

    java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...

  6. java中ArrayList和LinkedList的区别

    首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...

  7. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  8. java中wait和sleep的区别

    文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...

  9. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  10. Java中重载和复写的区别

    Java中重载和复写的区别 重载(overload) 复写(override) 区别和联系 重载(overload) 函数重载的最突出的例子就是类的构造函数,用户定义一个对象时可能会提供多种参数组合: ...

最新文章

  1. 多节锂电串联保护板ic_两节锂电池保护IC,芯片电路图如何设计
  2. 一个不错的讲解flex 3中自定义事件的文章
  3. bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能
  4. x61 linux 驱动 无线网卡,Linux环境Thinkpad X61 4G内存Mtrr表错误
  5. 《南溪的python灵隐笔记》——有趣的Munch字典库
  6. 从入门到精通,给Java学习者的几点建议
  7. 试用Windows Server 2008
  8. 计算机毕业设计Java小小银动漫网站(源码+系统+mysql数据库+Lw文档)
  9. Win系统 - Windows10 系统恢复语言栏位置的方法(二)
  10. 计算机启动过程中按DEL,电脑开机按del之后如何u盘装系统教程
  11. 雷泰RAYR3I2MSCL3+高温红外测温仪的参数指标
  12. 计算机科学引论connectivity,计算机科学引论课后题原文
  13. PHP面向对象技术(全面讲解)(高洛峰)
  14. MATLAB创建音乐《光年之外》
  15. 《伟大的小细节:互联网产品设计中的微创新思维》——3.6 基于当前场景的前因后果推演...
  16. 推荐的几本数学书【by DaHua Lin】
  17. R语言高比例送转策略
  18. mysql cache lock_mysql服务器上有sql状态status显示 Waiting for query cache lock?
  19. GridView中DataSourceID和DataSource替换
  20. 深度剖析——超融合架构应用与实践分享

热门文章

  1. 支付宝免签约 免手续费 支付接口API
  2. win10如何彻底关闭windows defender和关闭windows defender实时扫描保护
  3. getting和setting方法
  4. 为了孩子学英语,花几天时间写了个语法练习小程序
  5. Spring第一天 IOC 控制反转JavaBean规范 Bean的作用域 生命周期 依赖注入
  6. 八、数学处理和时间日期
  7. 1500D 单反拍出来的照片泛绿,怎么矫正 坑
  8. 安装VMware tools出现警告no default label for /tmp/vmware-block-restore0/tmp_file
  9. Java精炼语言语法描述
  10. 关于工作流activiti