嘘~ 正在从服务器偷取页面 . . .

Java 中 Boolean 和 boolean的区别


Java 中 Boolean 和 boolean的区别


开发过程中遇到的问题

/*****
 * 是否进行规格修改
 */
    private Boolean ischangespec=false;
public Boolean getIschangespec() {
	return ischangespec;
}
public void setIschangespec(Boolean ischangespec) {
	this.ischangespec = ischangespec;
}

增加以上字段之后,经过改轧的数据不会在生产明细中显示。


出现问题的原因

  • booleanJava 的基本数据类型,BooleanJava 的一个类。boolean 类型会在“赋零值”阶段给属性赋 false。而 Boolean 是一个类,会在“赋零值”阶段给对象赋 null。如果是静态属性,会在类加载时被赋值。如果是普通类属性,会在实例化对象时赋值。
  • 简单的来说,如果Boolean不设置默认值那么其默认为。如果boolean不设置默认值那么其默认为false

类加载机制:

  • 加载:根据类的全名获取类的二进制字节流,将类加载进内存并在堆中生成一个代表这个类的 Class 对象,作为方法区数据的访问入口。
  • 验证:验证 class 文件中的字节流是否符合 JVM 规范。
  • 准备:在方法区中为类的静态属性分配内存,并初始化默认值(boolean 的默认值是 falseBoolean 的默认值是 null)。
  • 解析:将常量池中的符号引用转化为直接引用,可以理解为对象引用转成指针。
  • 初始化:真正开始执行类中的代码,静态属性赋值和静态块。

对象实例化过程:

  • 检查类是否已经被加载(双亲委派)
  • 给对象分配内存空间(指针碰撞)
  • 零值初始化(false / null
  • 设置对象头(对象分代年龄等信息)
  • 执行<init>方法(属性初始化,语句块和构造方法)
    所以说,Boolean只是被加载了,还没有被实例化,在被实例化之前并没有分配内存,所以是 null

风险点:


解决问题措施:

  • ischangespec 字段的默认值删掉,默认值为null
  • 将默认值删掉之后,重启项目发现生产明细中不能显示的数据可以正常显示。

文章作者: 张纯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张纯 !
  目录