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
。 - 将默认值删掉之后,重启项目发现生产明细中不能显示的数据可以正常显示。