Java千問:instanceof運算符用法詳解

Java語言當中提供了一個叫做instanceof的運算符。很多教科書上對這個運算符的介紹並不詳細,只是簡單的說這個運算符是用來判斷某個對象是不是屬於某種類型。我們現在就用一篇短文介紹一下instanceof的運算符的作用和注意事項。請看下面的代碼片段
Java千問:instanceof運算符用法詳解
代碼中定義了一個接口和兩個類。大家記清楚它們之間的關係:Person類實現了Moveable接口,Student類繼承了Person類。緊接着我們來看下面的代碼
Java千問:instanceof運算符用法詳解
在代碼中,我們創建了一些對象,並且使用instanceof運算符判斷某個對象是否屬於某種類型。請問程序的輸出結果會是什麼呢?公佈一下答案:全部輸出true!有讀者可能不解爲什麼會是這樣的輸出結果?比如標號爲⑥的那行代碼,明明p2是Person類的對象,而Person類是Student的父類,爲什麼虛擬機會認爲p2是Student類的對象呢?

爲了弄清楚這個問題,我們必須搞清楚instanceof運算符的判斷依據。instanceof運算符在判斷的過程中,看的是引用實際指向的對象 (而不是看引用自身的類型)是不是可以被認定爲屬於某種類型。如果可以被認定爲屬於這種類型,那麼運算結果爲true;反之,如果假設不成立或未必成立,則運算結果爲false。比如說,p2雖然是Person類型的,但它實際指向了一個Student類型的對象,所以p2肯定屬於Student類型,因此輸出結果爲true。

其實我們可以用一種比較簡單的方法來理解輸出結果,那就是用一個自問句式來判斷:一個a是一個A嗎?比如說,p2實際指向的是一個Student類型的對象,而代碼中出現了” p2 instanceof Person”(見標號爲④的代碼),我們就可以自問一下:一個Student(學生,既p2指向的那個對象)是一個Person(人)嗎?一個學生當然是一個人,所以這句自問的答案肯定是true。反過來,如果代碼被寫成” p1 instanceof Student”, p1實際指向的是一個Person類的對象,我們再來分析一下運算結果,也可以採用這種自問的形式:一個Person(人)是一個Student(學生)嗎?一個人未必是一個學生,所以這種假設並不一定成立,因此判斷的結果爲false。

我想,講到這裏,讀者已經知道instanceof運算符的判斷依據了吧?那麼,在使用這個運算符的過程中,要注意哪些事項呢?歸納一下可以總結出兩點:
1、instanceof左邊必須是引用數據類型,而它右邊一定是類或者接口的名稱,不能是基礎數據類型的名稱。比如”1 instanceof int”或者” 1 instanceof Integer”這樣的寫法都是錯誤的。
2、如果instanceof左邊的引用指向的是一個空對象(null),那麼無論instanceof右邊無論是什麼類型,運算結果肯定是false。

如想系統學習Java編程,可以點擊https://edu.51cto.com/lecturer/2256836.html觀看我在本站的視頻課程,有問題也可以加入我的QQ羣291839907一起討論!

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