基于java中的null類型---有關null的9件事
今天聽到一個問題,java中的null類型,null竟然是一種類型
java語言中有兩種類型,一種是基本類型,還有一種是引用類型。還有一個特殊的null類型即表達式null的類型,它沒有名字。
因為null類型沒有名字,所以不可能聲明為null類型的變量或者轉換為null類型。
null引用是null類型表達式唯一可能的值。
null引用可以轉換為任意引用類型。
實際上,程序員可以忽略null類型,可以認為null僅僅是一個可以稱為任何引用類型的特殊符號。
一個null類型(null(空)引用是這種類型的唯一的一個值),可以賦值給任意類型,將返回一個該類型對象的空引用(其實還是null)。
對于java程序員來說,null是令人頭痛的東西。時常會受到空指針異常的騷擾。所以要好好了解一下null,確保正確使用null。
關于null的9件事
1、首先,null是java中的關鍵字,像public、static、final
它是大小寫敏感的,你不能將null寫成Null或NULL,編譯器將不能識別他們然后報錯。
現(xiàn)在,當你在敲代碼的時候,IDE可以糾正這個錯誤。
2、就像每種原始類型都有默認值一樣
int默認值為0,boolean的默認值為false,null是任何引用類型的默認值,不嚴格的說是所有object類型的默認值。就像你創(chuàng)建了一個布爾類型的變量,它將false作為自己的默認值,java中的任何引用變量都將null作為默認值。這對所有變量都是適用的,如成員變量、局部變量、實例變量、靜態(tài)變量(但當你使用一個沒有初始化的局部變量,編譯器會警告你)。
這對靜態(tài)和非靜態(tài)的object來說都是正確的。就像你在這里看到的這樣,myObj定義為靜態(tài)引用,所以可以在主方法里直接使用它。注意:主方法是靜態(tài)方法,不可使用非靜態(tài)變量。
3、要澄清一些誤解
null既不是對象也不是一種類型,它僅是一種特殊的值,你可以將其賦予任何引用類型,你也可以將null轉化成任何類型,
可以看到idea并沒有報錯,可以正常編譯。在編譯和運行時期,將null強制轉換成任何引用類型都是可行的,在運行時期都不會拋出空指針異常。
4、null可以賦值給引用變量
不能將null賦值給基本類型變量,如int、double、float、boolean。
可以看到,直接將null賦值給基本類型會出現(xiàn)編譯錯誤。但將null賦值給包裝類object,然后將object賦給各自的基本類型,編譯不會報錯,但運行會空指針,這是自動拆箱導致的。
5、任何含有null值的包裝類
在java拆箱生成基本數(shù)據(jù)類型時候都會拋出一個空指針異常。
這段代碼看起來非常簡單并且沒有錯誤。你所做的一切是找到一個數(shù)字在數(shù)組中出現(xiàn)了多少次, 這是Java數(shù)組中典型的尋找重復的技術。
開發(fā)者首先得到以前的數(shù)值,然后再加一,最后把值放回Map里。程序員可能會以為,調用put方法時,自動裝箱會自己處理好將int裝箱成Interger,但是他忘記了當一個數(shù)字沒有計數(shù)值的時候,HashMap的get()方法將會返回null,而不是0,因為Integer的默認值是null而不是0。
當把null值傳遞給一個int型變量的時候自動裝箱將會返回空指針異常。設想一下,如果這段代碼在一個if嵌套里,沒有在測試環(huán)境下運行,但是你一旦放在生產(chǎn)環(huán)境里,BOOM:-),是不是美茲茲。
6、如果使用了帶有null值的引用類型的變量,instanceof操作會返回false
這是instanceof操作一個很重要的特性,使得對強制類型轉換檢查很有用
7、可以使用靜態(tài)方法來使用一個值為null的引用類型變量
因為靜態(tài)方法使用靜態(tài)類型綁定,不會拋空指針異常
8、可以將null傳遞給方法使用
這時方法可以接收任何引用類型,如 public void print(Object obj) 可以這樣調用print(null).編譯可以通過,但結果就取決去你的方法了。這個例子中的print方法,不會拋出空指針異常,只是退出,業(yè)務邏輯允許的話,推薦使用null安全的方法。
9、可以使用== 或者 != 操作來比較null值
但是不能使用其他算法或者邏輯操作,如大于、小于。與SQL不同,java中的null==null會返回true;
避免空指針異??梢允鼓愕拇a變的null安全。
敲黑板,劃重點?。。?!——————>null是任何一個引用類型變量的默認值,在java中不能使用null引用來調用任何instance方法或者instance變量。
Java: null是什么??
null是什么?
對于一條實例化語句:
Student stu=new Student(); //語句1
先是聲明一個名為stu的Student類型變量,然后利用new關鍵字為其創(chuàng)建實例。
與下面的語句相比較:
Student stu; //語句2
語句2是聲明一個類型為Student 的變量stu,從表述習慣上講stu 是實例變量,但實際上此時stu并未成為一個真正的實例,它僅僅只是一個變量名字。
stu= new Student(); //語句3
語句3的執(zhí)行結果就使得stu真正成為了一個Student實例,它指向了內存中的某塊地址空間。
語句1是一步到位,定義了一個實例變量并同時賦值。
1、對于null的理解
為了明確地表示那些僅有名字而沒有實例空間的變量的具體內容,Java引入了關鍵字null, null 就是表示“空”的意思,是絕對意義上的空,這個空指的是不存在的意思。為了更好地理解null是什么,這里舉個例子:
有個準備進人施工階段的樓字建筑項目,設計圖紙已經(jīng)確定了,建筑設計師們正在討論某間單元的裝修效果時,該單元的房號已經(jīng)命名,假設為A901,此時,A901就是null的,它相當于上面寫的語句2(一個名為stu的Student),這里它只是一個名為A901的房屋單元。
而當該樓字項目已經(jīng)施工完畢的時候,則A901就地在它所處的位置上真正地占有了一塊物理空間,此時它就是非null(非空)了,也就是說它擁有了一塊實例化的空間。就算這間房屋里頭沒有擺放東西,它也是存在的。我們千萬不能將日常表達語“一間空的房問”等同于Java語言中的"房間為空”。
在Java中,假設房間類為Room,則:
Room room=null; //房間為空,房間room只是一個名字,實際不存在。 Room room= new Room(); //一間空的房間,這間房里沒東西。
null就是空,抽象意義上的空,空就是無的概念。
對于null的理解,應該是這樣的:僅有一個變量名,但實際上不存在。
2、null的作用
(1) 判斷一個對象實例是否null,
用if(obj= = null){}來判斷。
(2) 釋放內存,讓一個非null的實例變量賦值為null,這樣這個實例指針引用就被釋放了,等待JVM回收其對應的內存垃圾。
3、使用null時要注意的問題
(1) null是關鍵字,是大小寫敏感的,不能將null寫成Null或NULL.
(2) null用來標識一個空的對象,因此不能將null賦給基本型的變量。比如:
String s= null; //正確 int i=null; //錯誤,應修正為"int i=0;"char c= null; //錯誤
(3) 對于一個值為null 的對象,如果你試圖去訪問其成員,則會觸發(fā)空指針異常(NullPointerException)。
(4) 用instancaeof(判斷對象是否屬于某種類型)去操作null對象,會返回false.
如:有語句: String s= null;
則“s instanceof String”的結果是false。
(5) 可以使==或著!=操作來比較null值,但是不能使用其他算法或者邏輯操作,例如<或者>。
在Java中,null ==null將返回true。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)
這篇文章主要介紹了SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05java使用mybatis調用存儲過程返回一個游標結果集方式
這篇文章主要介紹了java使用mybatis調用存儲過程返回一個游標結果集方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Maven介紹與配置+IDEA集成Maven+使用Maven命令小結
Maven是Apache軟件基金會的一個開源項目,是一個優(yōu)秀的項目構建管理工具,它用來幫助開發(fā)者管理項目中的 jar,以及 jar 之間的依賴關系、完成項目的編譯、測試、打包和發(fā)布等工作,本文給大家介紹Maven介紹與配置+IDEA集成Maven+使用Maven命令,感興趣的朋友一起看看吧2024-01-01