Java 中 Boolean 和 boolean的区别
开发过程中遇到的问题
/*****
* 是否进行规格修改
*/
private Boolean ischangespec=false;
public Boolean getIschangespec() {
return ischangespec;
}
public void setIschangespec(Boolean ischangespec) {
this.ischangespec = ischangespec;
}
增加以上字段之后,经过改轧的数据不会在生产明细中显示。
出现问题的原因
boolean是Java的基本数据类型,Boolean是Java的一个类。boolean类型会在“赋零值”阶段给属性赋false。而Boolean是一个类,会在“赋零值”阶段给对象赋null。如果是静态属性,会在类加载时被赋值。如果是普通类属性,会在实例化对象时赋值。- 简单的来说,如果
Boolean不设置默认值那么其默认为空。如果boolean不设置默认值那么其默认为false
类加载机制:
- 加载:根据类的全名获取类的二进制字节流,将类加载进内存并在堆中生成一个代表这个类的
Class对象,作为方法区数据的访问入口。 - 验证:验证
class文件中的字节流是否符合JVM规范。 - 准备:在方法区中为类的静态属性分配内存,并初始化默认值(
boolean的默认值是false,Boolean的默认值是null)。 - 解析:将常量池中的符号引用转化为直接引用,可以理解为对象引用转成指针。
- 初始化:真正开始执行类中的代码,静态属性赋值和静态块。
对象实例化过程:
- 检查类是否已经被加载(双亲委派)
- 给对象分配内存空间(指针碰撞)
- 零值初始化(
false / null) - 设置对象头(对象分代年龄等信息)
- 执行
<init>方法(属性初始化,语句块和构造方法)
所以说,Boolean只是被加载了,还没有被实例化,在被实例化之前并没有分配内存,所以是null
风险点:
解决问题措施:
- 将
ischangespec字段的默认值删掉,默认值为null。 - 将默认值删掉之后,重启项目发现生产明细中不能显示的数据可以正常显示。