null是什麼類型,初始化null在內存中是如何分配內存的?

null:這個關鍵詞大家都不陌生,但是大家一定不太明白它是什麼類型的,或者它在內存中有什麼作用,又或者它是不是一個空指針等等,我在這總結了下null 的“意義”。

當我們爲一個引用變量初始化=null例如:

String str=null;

JVM會讓這個引用變量指向一個不確定類型的空對象內存(即null內存,),null表示不確定類型的靜態內存區域(假定虛擬機爲程序分配了個永久固定的null靜態內存),並且,假如這時候你輸出system.out.println(str);相當於輸出了null,而null是一個固定的不確定類型的內存,即可以看做是什麼類型也不是,也沒有繼承Object,當然沒有toString()方法,所以這句代碼不會默認調用str的toString()方法,所以會報錯NullPointerException(空指針異常)。

這時候str其實是指向一個內存的(null),當我們再次爲str初始化(new一個新對象時),就是讓str由指向null變成指向了new出來的新對象,這時候str纔是真正的被初始化。
我們有可能會發現了有很多時候如果我們不爲某些引用類型變量初始化null,後面再爲其new 對象時會報錯的(未初始化該類型),爲什麼呢??
比如這樣,我們輸入以下代碼:
Connection conn;
String catalog = conn.getCatalog();
系統會提示conn未初始化,當我們改成:
Connection conn=null;
String catalog = conn.getCatalog();
這時,系統編譯會通過。但運行時又會報錯空指針異常
這就是因爲Connection conn;只是聲明瞭一個變量,告訴虛擬機我過會有可能要用這個變量,但內存中並不存在這個變量,不能執行conn.getCatalog();,因此編譯不會通過。
當我們爲conn初始化null,虛擬機檢測到conn指向一個內存,即null,因此編譯會通過。
但是注意:當你讓一個非null的引用類型變量長期指向null。這樣這個對象不再被任何對象應用,JVM垃圾回收機制去會去回收它。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章