Java 中 Boolean 和 boolean的區別

​上次一個同學問,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 使用過程中有一個風險點,阿里巴巴開發手冊也寫得非常好
ali

簡單來說就是,boolean 定義的屬性一定要有值,如果 Integer 對象值爲 null,解包過程中就會出現NPE。

想象一種場景:你女票問你:你愛我嗎?但你沒聽清。如果你是 Boolean 就會回答,我沒聽清(null),如果你是 boolean 就會回答,*** (NPE)

之後就會有個狗頭被打爆。
interesting

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章