上次一個同學問,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 定義的屬性一定要有值,如果 Integer
對象值爲 null
,解包過程中就會出現NPE。
想象一種場景:你女票問你:你愛我嗎?但你沒聽清。如果你是 Boolean
就會回答,我沒聽清(null
),如果你是 boolean
就會回答,*** (NPE)
之後就會有個狗頭被打爆。