1.10 instanceof关键字
嚴格來說 instanceof 是 Java 中的一個雙目運算符,由于它是由字母組成的,所以也是 Java 的保留關鍵字。在 Java 中可以使用 instanceof 關鍵字判斷一個對象是否為一個類(或接口、抽象類、父類)的實例,
語法格式如下所示。
boolean result = obj instanceof Class其中,obj 是一個對象,Class 表示一個類或接口。obj 是 class 類(或接口)的實例或者子類實例時,結果 result 返回 true,否則返回 false。
下面介紹 Java instanceof 關鍵字的幾種用法。
1)聲明一個 class 類的對象,判斷 obj 是否為 class 類的實例對象(很普遍的一種用法),如以下代碼:
Integer integer = new Integer(1); System.out.println(integer instanceof Integer); // true2)聲明一個 class 接口實現類的對象 obj,判斷 obj 是否為 class 接口實現類的實例對象,如以下代碼:
Java 集合中的 List 接口有個典型實現類 ArrayList。
所以我們可以用 instanceof 運算符判斷 ArrayList 類的對象是否屬于 List 接口的實例,如果是返回 true,否則返回 false。
ArrayList arrayList = new ArrayList(); System.out.println(arrayList instanceof List); // true或者反過來也是返回 true
List list = new ArrayList(); System.out.println(list instanceof ArrayList); // true3)obj 是 class 類的直接或間接子類
我們新建一個父類 Person.class,代碼如下:
創建 Person 的子類 Man,代碼如下:
public class Man extends Person { }測試代碼如下:
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 的子類,Person 不是 Man 的子類,所以返回結果為 false。
值得注意的是 obj 必須為引用類型,不能是基本類型。例如以下代碼:
int i = 0; System.out.println(i instanceof Integer); // 編譯不通過 System.out.println(i instanceof Object); // 編譯不通過所以,instanceof 運算符只能用作對象的判斷。
當 obj 為 null 時,直接返回 false,因為 null 沒有引用任何對象。
Integer i = 1; System.out.println(i instanceof null); // false所以,obj 的類型必須是引用類型或空類型,否則會編譯錯誤。
當 class 為 null 時,會發生編譯錯誤,錯誤信息如下:
Syntax error on token "null", invalid ReferenceType所以 class 只能是類或者接口。
編譯器會檢查 obj 能否轉換成右邊的 class 類型,如果不能轉換則直接報錯,如果不能確定類型,則通過編譯。這句話有些難理解,下面我們舉例說明。
Person p1 = new Person(); System.out.println(p1 instanceof String); // 編譯報錯 System.out.println(p1 instanceof List); // false System.out.println(p1 instanceof List<?>); // false System.out.println(p1 instanceof List<Person>); // 編譯報錯上述代碼中,Person 的對象 p1 很明顯不能轉換為 String 對象,那么p1 instanceof String不能通過編譯,但p1 instanceof List卻能通過編譯,而instanceof List又不能通過編譯了。關于這些問題,可以查看Java語言規范Java SE8版尋找答案,如圖所示。
可以理解成以下代碼:
boolean result; if (obj == null) {result = false; // 當obj為null時,直接返回false } else {try {// 判斷obj是否可以強制轉換為TT temp = (T) obj; result = true;} catch (ClassCastException e) {result = false;} }在 T 不為 null 和 obj 不為 null 時,如果 obj 可以轉換為 T 而不引發異常(ClassCastException),則該表達式值為 true ,否則值為 false 。所以對于上面提出的問題就很好理解了,p1 instanceof String會編譯報錯,是因為(String)p1是不能通過編譯的,而(List)p1可以通過編譯。
instanceof 也經常和三目(條件)運算符一起使用,代碼如下:
A instanceof B ? A : C
判斷 A 是否可以轉換為 B ,如果可以轉換返回 A ,不可以轉換則返回 C。下面通過一個例子來講解,代碼如下:
public class Test {public Object animalCall(Animal a) {String tip = "這個動物不是牛!";// 判斷參數a是不是Cow的對象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 { }以上代碼中,我們聲明了一個 Animal 類作為父類,Cow 類和 Sheep 類為 Animal 的子類,在 Test 類的 main 函數中創建類 Sheep 的對象作為形參傳遞到 animalCall 方法中,因為 Sheep 類的對象不能轉換為 Cow 類型,所以輸出結果為“這個動物不是牛!”。
總結
以上是生活随笔為你收集整理的1.10 instanceof关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.9 多态性:什么是多态?
- 下一篇: 1.13 抽象类和接口的区别