instanceof關鍵字的實現原理淺析
阿新 • • 發佈:2019-02-02
概念和用法:
instanceof關鍵字,也可以叫做型別比較運算子,在java中是用來判斷一個類是否是另一個類的例項。
用法: boolean object instanceof class
例如:a instanceof A,返回值是布林型。用法其實是比較簡單的,通俗的理解就是左邊的例項是否是右邊類的子類或者實現。右邊的類型別可以以是class,interface,array。參考oraclejdk8的規範,解釋一下上面的三句話:
1.instanceof左邊的型別必須是引用型別或者null,否則會報錯(右邊的型別不能為null);
2.instanceof右邊的型別不是可具體化的型別時,編譯會報錯(也就是右邊的型別要是可具體化型別,簡單的理解為非泛型的型別,因為編譯時會被型別擦除,細究可以參考 可具體化型別);
3.如果左邊強制轉換右邊的型別失敗,那麼返回值不會是true(就是說左邊不能強轉到右邊的都會返回false,外國人語境的差異吧,聽起來很拗口)
用java程式碼的形式表示instanceof的實現原理就是:
boolean result;
if (obj == null) {
result = false;
} else {
try {
T temp = (T) obj;
result = true;
} catch (ClassCastException e) {
result = false;
}
}
instanceof使用例項
public class InstanceOfTest {
public static void main(String[] args) {
String [] stringArray = new String[]{};
String text = "我是字串";
B[] bArray = new B[]{};
B b = new B();
A ab = new B();
System.out.println("class instanceof test");
System. out.println(b instanceof A);
System.out.println(b instanceof B);
System.out.println(b instanceof C);
System.out.println(ab instanceof A);
System.out.println(ab instanceof B);
System.out.println(ab instanceof C);
System.out.println(null instanceof Object);
System.out.println(text instanceof String);
System.out.println("interface instanceof test");
System.out.println(b instanceof B);
System.out.println(b instanceof C);
System.out.println(b instanceof D);
System.out.println(ab instanceof B);
System.out.println(ab instanceof C);
System.out.println(ab instanceof D);
System.out.println("array instanceof test");
System.out.println(b instanceof List);
System.out.println(bArray instanceof A[]);
System.out.println(bArray instanceof B[]);
System.out.println(bArray instanceof C[]);
System.out.println(bArray instanceof D[]);
System.out.println(stringArray instanceof String[]);
}
}
class B extends A implements C {
}
class A {
}
interface C extends D {
}
interface D {
}
通過了上面對instanceof的用法解釋,想必這些結果讀者應該沒有什麼太多的疑問,可能比較注意的就是ab的instanceof的使用,ab是指向的B的例項,所以和b基本沒有區別,然後instanceof右邊的型別使用泛型是會編譯報錯的,因為泛型是上面說到的非可具體化型別,instanceof還可以用來判斷陣列。