java instanceof
運算子用於測試指定物件是否是指定型別(類或子類或介面)的範例。
java中的instanceof
也稱為型別比較運算子,因為它將型別與範例進行比較。 它返回true
或false
。 如果對任何具有null
值的變數應用instanceof
運算子,則返回false。
java instanceof的簡單範例
下面來看看範例運算子的簡單範例,它測試當前類。
class Simple1 {
public static void main(String args[]) {
Simple1 s = new Simple1();
System.out.println(s instanceof Simple1);// true
}
}
執行上面試程式碼,得到以下結果 -
true
子類型別的物件也是父類別的型別。 例如,如果Dog
擴充套件了Animal
,那麼Dog
的物件可以通過Dog
或Animal
類來參照。
java instanceof運算子的另一個例子
class Animal {
}
class Dog1 extends Animal {// Dog inherits Animal
public static void main(String args[]) {
Dog1 d = new Dog1();
System.out.println(d instanceof Animal);// true
}
}
執行上面程式碼,得到以下結果 -
true
instanceof測試null值的變數範例
如果我們對具有null
值的變數應用instanceof
運算子,則返回false
。來看看下面給出的例子,將instanceof
運算子應用於具有null
值的變數。
class Dog2 {
public static void main(String args[]) {
Dog2 d = null;
System.out.println(d instanceof Dog2);// false
}
}
執行上面程式碼,得到以下結果 -
false
使用java instanceof運算子的向下轉換
當子型別參照父類別的物件時,它被稱為向下轉換(downcasting)。 如果直接執行它,編譯器會出現編譯錯誤。 如果通過型別轉換來執行,在執行時會丟擲:ClassCastException
。 但是如果使用instanceof
運算子,可以進行向下轉換。
Dog d=new Animal();//Compilation error
如果通過型別轉換執行向下轉換,則在執行時丟擲:ClassCastException
。
Dog d=(Dog)new Animal();
//Compiles successfully but ClassCastException is thrown at runtime
使用instanceof進行向下轉換
現在看看下面這個例子,通過instanceof
運算子進行向下轉換。
class Animal {
}
class Dog3 extends Animal {
static void method(Animal a) {
if (a instanceof Dog3) {
Dog3 d = (Dog3) a;// downcasting
System.out.println("ok downcasting performed");
}
}
public static void main(String[] args) {
Animal a = new Dog3();
Dog3.method(a);
}
}
執行上面程式碼,得到以下結果 -
ok downcasting performed
向下轉換不使用instanceof
也可以在不使用instanceof
運算子的情況下執行下轉換,如以下範例程式碼所示:
class Animal {
}
class Dog4 extends Animal {
static void method(Animal a) {
Dog4 d = (Dog4) a;// downcasting
System.out.println("ok downcasting performed");
}
public static void main(String[] args) {
Animal a = new Dog4();
Dog4.method(a);
}
}
執行上面程式碼,得到以下結果 -
ok downcasting performed
仔細看看,被參照的實際物件是Dog
類的物件。 所以如果向下轉換它,它是沒有問題的。 但是,如果也可以這樣寫:
Animal a=new Animal();
Dog.method(a);
//Now ClassCastException but not in case of instanceof operator
這是一個instanceof的終極範例,通過下面的例子中的程式碼看看instanceof
關鍵字的真正用法。
interface Printable {
}
class A implements Printable {
public void a() {
System.out.println("a method");
}
}
class B implements Printable {
public void b() {
System.out.println("b method");
}
}
class Call {
void invoke(Printable p) {// upcasting
if (p instanceof A) {
A a = (A) p;// Downcasting
a.a();
}
if (p instanceof B) {
B b = (B) p;// Downcasting
b.b();
}
}
}// end of Call class
class Test4 {
public static void main(String args[]) {
Printable p = new B();
Call c = new Call();
c.invoke(p);
}
}
執行上面程式碼,得到以下結果 -
b method