在本教程中,您將在示例的幫助下詳細(xì)了解Java instanceof運(yùn)算符。
在Java中,instanceof關(guān)鍵字是二進(jìn)制運(yùn)算符。它用于檢查對(duì)象是否是特定類的實(shí)例。
運(yùn)算符還檢查對(duì)象是否是實(shí)現(xiàn)接口的類的實(shí)例(將在本教程后面討論)。
instanceof的語(yǔ)法為:
result = objectName instanceof className;
instanceof運(yùn)算符的左操作數(shù)是對(duì)象名,右操作數(shù)是類名。如果對(duì)象是類的實(shí)例,則結(jié)果為true;如果不是,則為false。
class Main { public static void main (String[] args) { String name = "nhooo"; Integer age = 22; System.out.println("name是String的實(shí)例嗎: "+ (name instanceof String)); System.out.println("age是Integer的實(shí)例嗎: "+ (age instanceof Integer)); } }
輸出:
name是String的實(shí)例嗎: true age是Integer的實(shí)例嗎: true
在上面的示例中,我們創(chuàng)建了一個(gè)String類型的對(duì)象name和另一個(gè)Integer類型的對(duì)象age。 然后,我們使用instanceof運(yùn)算符檢查名稱是否為String類型以及age是否為Integer類型。
在繼承的情況下,instanceof運(yùn)算符用于檢查子類的對(duì)象是否也是超類的實(shí)例。
class Animal { } //Dog類是Animal的子類 class Dog extends Animal { } class Main { public static void main(String[] args){ Dog d1 = new Dog(); //檢查d1是否是Dog的對(duì)象 System.out.println("d1是Dog的實(shí)例嗎: "+ (d1 instanceof Dog)); //檢查d1是否是Animal的對(duì)象 System.out.println("d1是Animal的實(shí)例嗎: "+ (d1 instanceof Animal)); } }
輸出:
d1是Dog的實(shí)例嗎: true d1是Animal的實(shí)例嗎: true
在上面的示例中,d1是Dog和Animal類的實(shí)例。 因此,d1 instanceof Dog 和 d1 instanceof Animal 都為true。
在Java中,所有類都繼承自O(shè)bject類,繼承Object類不使用extends關(guān)鍵字。這種繼承在Java中隱式發(fā)生。
class Animal { } class Dog { } class Cat { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = new Animal(); Cat c1 = new Cat(); System.out.println("d1是Object類的實(shí)例嗎: "+ (d1 instanceof Object)); System.out.println("a1是Object類的實(shí)例嗎: "+ (a1 instanceof Object)); System.out.println("c1是Object類的實(shí)例嗎: "+ (c1 instanceof Object)); } }
輸出:
d1是Object類的實(shí)例嗎: true a1是Object類的實(shí)例嗎: true c1是Object類的實(shí)例嗎: true
在上面的實(shí)例中,我們分別創(chuàng)建了類Animal、Dog和Cat的對(duì)象a1、d1和c1。我們已經(jīng)使用instanceof操作符來(lái)檢查這些對(duì)象a1, d1, c1是否也是Object類的對(duì)象。輸出結(jié)果都為true(真)。
這是因?yàn)镺bject類是java.lang包中定義的根類。 所有其他類都是在Java中形成層次結(jié)構(gòu)的Object類的子類。
在Java中,子類的對(duì)象可以視為父類的對(duì)象。這稱為向上轉(zhuǎn)型。通俗地講即是將子類對(duì)象轉(zhuǎn)為父類對(duì)象。此處父類對(duì)象可以是接口。
Java編譯器自動(dòng)執(zhí)行向上轉(zhuǎn)型。
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; a1.displayInfo(); } }
輸出:
I am an animal.
在上面的實(shí)例中,我們創(chuàng)建了Dog類的對(duì)象d1。我們使用d1對(duì)象來(lái)創(chuàng)建Animal類的對(duì)象a1。這在Java中稱為向上轉(zhuǎn)型。
該代碼執(zhí)行沒(méi)有任何問(wèn)題。這是因?yàn)橄蛏限D(zhuǎn)型是由Java編譯器自動(dòng)完成的。
向下轉(zhuǎn)型是向上轉(zhuǎn)型的相反過(guò)程,也就是與向上轉(zhuǎn)型相反,即是把父類對(duì)象轉(zhuǎn)為子類對(duì)象。
在向下轉(zhuǎn)型的情況下,父類的對(duì)象被視為子類的對(duì)象。我們必須在Java中顯式地指示編譯器向下轉(zhuǎn)型。
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Animal a1 = new Animal(); Dog d1 = (Dog)a1; // 向下類型轉(zhuǎn)換 d1.displayInfo(); } }
運(yùn)行程序時(shí),將獲得名為的異常ClassCastException。讓我們看看這里發(fā)生了什么。
在這里,我們創(chuàng)建了一個(gè)父類Animal的對(duì)象a1。然后我們嘗試將a1對(duì)象強(qiáng)制轉(zhuǎn)換為子類Dog的對(duì)象d1。
這引起了問(wèn)題。 這是因?yàn)楦割怉nimal的a1對(duì)象也可能引用其他子類。 如果我們與Dog一起創(chuàng)建了另一個(gè)子類Cat; 動(dòng)物可能是貓,也可能是狗,引起歧義。
為了解決這個(gè)問(wèn)題,我們可以使用instanceof運(yùn)算符。這是如何做:
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog"); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; // 向上轉(zhuǎn)型 if (a1 instanceof Dog){ Dog d2 = (Dog)a1; // 向下轉(zhuǎn)型 d2.displayInfo(); } } }
輸出:
I am a dog
在上面的示例中,我們使用instanceof運(yùn)算符檢查a1對(duì)象是否為Dog類的實(shí)例。僅當(dāng)表達(dá)式a1 instanceof Dog為true時(shí)才進(jìn)行向下類型轉(zhuǎn)換。
instanceof運(yùn)算符還用于檢查類的對(duì)象是否也是實(shí)現(xiàn)該類的接口的實(shí)例。
interface Animal { } class Dog implements Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); System.out.println("d1對(duì)象是Animal的實(shí)例嗎: "+(d1 instanceof Animal)); } }
輸出:
d1對(duì)象是Animal的實(shí)例嗎: true
在上面的示例中,我們創(chuàng)建了一個(gè)Dog實(shí)現(xiàn)Animal接口的類。
然后,創(chuàng)建Dog類的對(duì)象d1。我們已經(jīng)使用instanceof運(yùn)算符來(lái)檢查d1對(duì)象是否也是Animal接口的實(shí)例。