java中的null类型---有关null的9件事
摘自?https://blog.csdn.net/qq_25077777/article/details/80174763
?
今天聽到一個問題,java中的null類型,null竟然是一種類型
????????? ?java語言中有兩種類型,一種是基本類型,還有一種是引用類型。還有一個特殊的null類型即表達(dá)式null的類型,它沒有名字。
????????? ? 因為null類型沒有名字,所以不可能聲明為null類型的變量或者轉(zhuǎn)換為null類型。
????????? ? null引用是null類型表達(dá)式唯一可能的值。
????????? ? null引用可以轉(zhuǎn)換為任意引用類型。
????????? ? 實際上,程序員可以忽略null類型,可以認(rèn)為null僅僅是一個可以稱為任何引用類型的特殊符號。
????????? ? 一個null類型(null(空)引用是這種類型的唯一的一個值),可以賦值給任意類型,將返回一個該類型對象的空引用(其實還是null)。
?
????????? ? 對于java程序員來說,null是令人頭痛的東西。時常會受到空指針異常的騷擾。所以要好好了解一下null,確保正確使用null。
????? ? 關(guān)于null的9件事
? ? 1)?? ?首先,null是java中的關(guān)鍵字,像public、static、final。它是大小寫敏感的,你不能將null寫成Null或NULL,編譯器將不能識別他們?nèi)缓髨箦e。
????????????? ?現(xiàn)在,當(dāng)你在敲代碼的時候,IDE可以糾正這個錯誤。
? ? 2)?? ? 就像每種原始類型都有默認(rèn)值一樣,int默認(rèn)值為0,boolean的默認(rèn)值為false,null是任何引用類型的默認(rèn)值,不嚴(yán)格的說是所有object類型的默認(rèn)值。就像你創(chuàng)建了一個布爾類型的變量,它將false作為自己的默認(rèn)值,java中的任何引用變量都將null作為默認(rèn)值。這對所有變量都是適用的,如成員變量、局部變量、實例變量、靜態(tài)變量(但當(dāng)你使用一個沒有初始化的局部變量,編譯器會警告你)。
?
????? ? 這對靜態(tài)和非靜態(tài)的object來說都是正確的。就像你在這里看到的這樣,myObj定義為靜態(tài)引用,所以可以在主方法里直接使用它。注意:主方法是靜態(tài)方法,不可使用非靜態(tài)變量。
????? ? 3)?? ? 要澄清一些誤解,null既不是對象也不是一種類型,它僅是一種特殊的值,你可以將其賦予任何引用類型,你也可以將null轉(zhuǎn)化成任何類型,
?
????????可以看到idea并沒有報錯,可以正常編譯。在編譯和運行時期,將null強制轉(zhuǎn)換成任何引用類型都是可行的,在運行時期都不會拋出空指針異常。
????? ? 4)? ? null可以賦值給引用變量,不能將null賦值給基本類型變量,如int、double、float、boolean。
?
???? ? 可以看到,直接將null賦值給基本類型會出現(xiàn)編譯錯誤。但將null賦值給包裝類object,然后將object賦給各自的基本類型,編譯不會報錯,但運行會空指針,這是自動拆箱導(dǎo)致的。
????? ? 5)? ? 任何含有null值的包裝類在java拆箱生成基本數(shù)據(jù)類型時候都會拋出一個空指針異常。
?
?
???????????????????這段代碼看起來非常簡單并且沒有錯誤。你所做的一切是找到一個數(shù)字在數(shù)組中出現(xiàn)了多少次,?這是Java數(shù)組中典型的尋找重復(fù)的技術(shù)。開發(fā)者首先得到以前的數(shù)值,然后再加一,最后把值放回Map里。程序員可能會以為,調(diào)用put方法時,自動裝箱會自己處理好將int裝箱成Interger,但是他忘記了當(dāng)一個數(shù)字沒有計數(shù)值的時候,HashMap的get()方法將會返回null,而不是0,因為Integer的默認(rèn)值是null而不是0。當(dāng)把null值傳遞給一個int型變量的時候自動裝箱將會返回空指針異常。設(shè)想一下,如果這段代碼在一個if嵌套里,沒有在測試環(huán)境下運行,但是你一旦放在生產(chǎn)環(huán)境里,BOOM:-),是不是美茲茲。
????????????? ? 6)?? ? 如果使用了帶有null值的引用類型的變量,instanceof操作會返回false
?
? ? 這是instanceof操作一個很重要的特性,使得對強制類型轉(zhuǎn)換檢查很有用
????????????????? ? 7)? ? 可以使用靜態(tài)方法來使用一個值為null的引用類型變量。因為靜態(tài)方法使用靜態(tài)類型綁定,不會拋空指針異常
?
???????????????????? 8)????? ? 可以將null傳遞給方法使用,這時方法可以接收任何引用類型,如 public void print(Object obj) 可以這樣調(diào)用print(null).編譯可以通過,但結(jié)果就取決去你的方法了。這個例子中的print方法,不會拋出空指針異常,只是退出,業(yè)務(wù)邏輯允許的話,推薦使用null安全的方法。
????????????????? ? 9)? ? 可以使用== 或者 != 操作來比較null值,但是不能使用其他算法或者邏輯操作,如大于、小于。與SQL不同,java中的null==null會返回true;
?
? ? ? ? ? ? ? ? 避免空指針異常可以使你的代碼變的null安全。
?????????????????敲黑板,劃重點!!!!——————>null是任何一個引用類型變量的默認(rèn)值,在java中不能使用null引用來調(diào)用任何instance方法或者instance變量。
轉(zhuǎn)載于:https://www.cnblogs.com/xinruyi/p/11186151.html
總結(jié)
以上是生活随笔為你收集整理的java中的null类型---有关null的9件事的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP缓存及其使用
- 下一篇: 74 计算机图形学开源处理库