日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java instanceof关键字详解

發(fā)布時(shí)間:2025/3/12 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java instanceof关键字详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

嚴(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); // true

2 . 聲明一個(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。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

所以我們可以用 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); // true

3 . obj 是 class 類(lèi)的直接或間接子類(lèi)
我們新建一個(gè)父類(lèi) Person.class,代碼如下:

public class Person { }

創(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。