Java 中 Boolean 和 boolean的区别
上次一个同学问,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 使用过程中有一个风险点,阿里巴巴开发手册也写得非常好
简单来说就是,boolean 定义的属性一定要有值,如果 Boolean
对象值为 null
,解包过程中就会出现NPE。
想象一种场景:你女票问你:你爱我吗?但你没听清。如果你是 Boolean
就会回答,我没听清(null
),如果你是 boolean
就会回答,不爱了 (false)
之后就会有个狗头被打爆。
Java 中 Boolean 和 boolean的区别相关推荐
- Java中equals()方法和==的区别分析
Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...
- Java中notify和notifyAll的区别 - 何时以及如何使用
Java notify vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...
- java 中long和Long的区别
转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...
- Java中Long和long的区别
转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...
- java中的异常种类和区别以及处理机制和区别
java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...
- java中ArrayList和LinkedList的区别
首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- java中wait和sleep的区别
文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...
- java throw与throws_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- Java中重载和复写的区别
Java中重载和复写的区别 重载(overload) 复写(override) 区别和联系 重载(overload) 函数重载的最突出的例子就是类的构造函数,用户定义一个对象时可能会提供多种参数组合: ...
最新文章
- 多节锂电串联保护板ic_两节锂电池保护IC,芯片电路图如何设计
- 一个不错的讲解flex 3中自定义事件的文章
- bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能
- x61 linux 驱动 无线网卡,Linux环境Thinkpad X61 4G内存Mtrr表错误
- 《南溪的python灵隐笔记》——有趣的Munch字典库
- 从入门到精通,给Java学习者的几点建议
- 试用Windows Server 2008
- 计算机毕业设计Java小小银动漫网站(源码+系统+mysql数据库+Lw文档)
- Win系统 - Windows10 系统恢复语言栏位置的方法(二)
- 计算机启动过程中按DEL,电脑开机按del之后如何u盘装系统教程
- 雷泰RAYR3I2MSCL3+高温红外测温仪的参数指标
- 计算机科学引论connectivity,计算机科学引论课后题原文
- PHP面向对象技术(全面讲解)(高洛峰)
- MATLAB创建音乐《光年之外》
- 《伟大的小细节:互联网产品设计中的微创新思维》——3.6 基于当前场景的前因后果推演...
- 推荐的几本数学书【by DaHua Lin】
- R语言高比例送转策略
- mysql cache lock_mysql服务器上有sql状态status显示 Waiting for query cache lock?
- GridView中DataSourceID和DataSource替换
- 深度剖析——超融合架构应用与实践分享
热门文章
- 支付宝免签约 免手续费 支付接口API
- win10如何彻底关闭windows defender和关闭windows defender实时扫描保护
- getting和setting方法
- 为了孩子学英语,花几天时间写了个语法练习小程序
- Spring第一天 IOC 控制反转JavaBean规范 Bean的作用域 生命周期 依赖注入
- 八、数学处理和时间日期
- 1500D 单反拍出来的照片泛绿,怎么矫正 坑
- 安装VMware tools出现警告no default label for /tmp/vmware-block-restore0/tmp_file
- Java精炼语言语法描述
- 关于工作流activiti