您好,登錄后才能下訂單哦!
簡介
instanceof是Java、php的一個二元操作符(運算符),和==,>,<是同一類東西。由于它是由字母組成的,所以也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回boolean類型的數據。可以用來判斷繼承中的子類的實例是否為父類的實現。相當于c#中的is操作符。java中的instanceof是通過返回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個實例。
我們現在就用一篇短文介紹一下instanceof的運算符的作用和注意事項。請看下面的代碼片段
代碼中定義了一個接口和兩個類。大家記清楚它們之間的關系:Person類實現了Moveable接口,Student類繼承了Person類。緊接著我們來看下面的代碼
在代碼中,我們創建了一些對象,并且使用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。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。