Java instanceof关键字详解
嚴(yán)格來(lái)說(shuō) instanceof 是 Java 中的一個(gè)雙目運(yùn)算符,由于它是由字母組成的,所以也是 Java 的保留關(guān)鍵字。在 Java 中可以使用 instanceof 關(guān)鍵字判斷一個(gè)對(duì)象是否為一個(gè)類(lèi)(或接口、抽象類(lèi)、父類(lèi))的實(shí)例,語(yǔ)法格式如下所示。
boolean result = obj instanceof Class其中,obj 是一個(gè)對(duì)象,Class 表示一個(gè)類(lèi)或接口。obj 是 class 類(lèi)(或接口)的實(shí)例或者子類(lèi)實(shí)例時(shí),結(jié)果 result 返回 true,否則返回 false。
Java instanceof 關(guān)鍵字的幾種用法。
1 . 聲明一個(gè) class 類(lèi)的對(duì)象,判斷 obj 是否為 class 類(lèi)的實(shí)例對(duì)象(普遍的一種用法),如以下代碼:
Integer integer = new Integer(1); System.out.println(integer instanceof Integer); // true2 . 聲明一個(gè) class 接口實(shí)現(xiàn)類(lèi)的對(duì)象 obj,判斷 obj 是否為 class 接口實(shí)現(xiàn)類(lèi)的實(shí)例對(duì)象,如以下代碼:
Java 集合中的 List 接口有個(gè)典型實(shí)現(xiàn)類(lèi) ArrayList。
所以我們可以用 instanceof 運(yùn)算符判斷 ArrayList 類(lèi)的對(duì)象是否屬于 List 接口的實(shí)例,如果是返回 true,否則返回 false。
ArrayList arrayList = new ArrayList(); System.out.println(arrayList instanceof List); // true或者反過(guò)來(lái)也是返回 true
List list = new ArrayList(); System.out.println(list instanceof ArrayList); // true3 . obj 是 class 類(lèi)的直接或間接子類(lèi)
我們新建一個(gè)父類(lèi) Person.class,代碼如下:
創(chuàng)建 Person 的子類(lèi) Man,代碼如下:
public class Man extends Person { }測(cè)試代碼如下:
Person p1 = new Person(); Person p2 = new Man(); Man m1 = new Man(); System.out.println(p1 instanceof Man); // false System.out.println(p2 instanceof Man); // true System.out.println(m1 instanceof Man); // true第 4 行代碼中,Man 是 Person 的子類(lèi),Person 不是 Man 的子類(lèi),所以返回結(jié)果為 false。
值得注意的是 obj 必須為引用類(lèi)型,不能是基本類(lèi)型。例如以下代碼:
int i = 0; System.out.println(i instanceof Integer); // 編譯不通過(guò) System.out.println(i instanceof Object); // 編譯不通過(guò)所以,instanceof 運(yùn)算符只能用作對(duì)象的判斷。
當(dāng) obj 為 null 時(shí),直接返回 false,因?yàn)?null 沒(méi)有引用任何對(duì)象。
Integer i = 1; System.out.println(i instanceof null); // false所以,obj 的類(lèi)型必須是引用類(lèi)型或空類(lèi)型,否則會(huì)編譯錯(cuò)誤。
當(dāng) class 為 null 時(shí),會(huì)發(fā)生編譯錯(cuò)誤,錯(cuò)誤信息如下:
Syntax error on token "null", invalid ReferenceType所以 class 只能是類(lèi)或者接口。
編譯器會(huì)檢查 obj 能否轉(zhuǎn)換成右邊的 class 類(lèi)型,如果不能轉(zhuǎn)換則直接報(bào)錯(cuò),如果不能確定類(lèi)型,則通過(guò)編譯。示例。
Person p1 = new Person(); System.out.println(p1 instanceof String); // 編譯報(bào)錯(cuò) System.out.println(p1 instanceof List); // false System.out.println(p1 instanceof List<?>); // false System.out.println(p1 instanceof List<Person>); // 編譯報(bào)錯(cuò)上述代碼中,Person 的對(duì)象 p1 很明顯不能轉(zhuǎn)換為 String 對(duì)象,那么p1 instanceof String不能通過(guò)編譯,但p1 instanceof List卻能通過(guò)編譯,而instanceof List又不能通過(guò)編譯了。
上述可以理解成以下代碼:
boolean result; if (obj == null) {result = false; // 當(dāng)obj為null時(shí),直接返回false } else {try {// 判斷obj是否可以強(qiáng)制轉(zhuǎn)換為T(mén)T temp = (T) obj; result = true;} catch (ClassCastException e) {result = false;} }在 T 不為 null 和 obj 不為 null 時(shí),如果 obj 可以轉(zhuǎn)換為 T 而不引發(fā)異常(ClassCastException),則該表達(dá)式值為 true ,否則值為 false 。所以對(duì)于上面提出的問(wèn)題就很好理解了,p1 instanceof String會(huì)編譯報(bào)錯(cuò),是因?yàn)?String)p1是不能通過(guò)編譯的,而(List)p1可以通過(guò)編譯。
instanceof 也經(jīng)常和三目(條件)運(yùn)算符一起使用,代碼如下:
A instanceof B ? A : C判斷 A 是否可以轉(zhuǎn)換為 B ,如果可以轉(zhuǎn)換返回 A ,不可以轉(zhuǎn)換則返回 C。下面通過(guò)一個(gè)例子來(lái)講解,代碼如下:
public class Test {public Object animalCall(Animal a) {String tip = "這個(gè)動(dòng)物不是牛!";// 判斷參數(shù)a是不是Cow的對(duì)象return a instanceof Cow ? (Cow) a : tip;}public static void main(String[] args) {Sheep sh = new Sheep();Test test = new Test();System.out.println(test.animalCall(sh));} }class Animal {}class Cow extends Animal {}class Sheep extends Animal {}以上代碼中,我們聲明了一個(gè) Animal 類(lèi)作為父類(lèi),Cow 類(lèi)和 Sheep 類(lèi)為 Animal 的子類(lèi),在 Test 類(lèi)的 main 函數(shù)中創(chuàng)建類(lèi) Sheep 的對(duì)象作為形參傳遞到 animalCall 方法中,因?yàn)?Sheep 類(lèi)的對(duì)象不能轉(zhuǎn)換為 Cow 類(lèi)型,所以輸出結(jié)果為“這個(gè)動(dòng)物不是牛!”。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java instanceof关键字详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java 文件目录显示
- 下一篇: Java 输出链表的第一个和最后一个元素