鍍金池/ 教程/ Java/ Java instanceof運(yùn)算符
Java for循環(huán)
Java接口
Java是什么?
Java命名約定
java中方法重載和方法重寫的區(qū)別
Java運(yùn)算符
Java抽象類
Java快速入門
Java實例初始化程序塊
Java靜態(tài)綁定和動態(tài)綁定
Java do-while循環(huán)
Java對象克隆
Java Object類
Java聚合
Java繼承
Java this關(guān)鍵字
Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)
Java構(gòu)造器(構(gòu)造方法)
Eclipse安裝和配置
Java多態(tài)
Java方法重載
Java while循環(huán)
Java教程
Java按值調(diào)用和引用調(diào)用
Java strictfp關(guān)鍵字
Java封裝
Java語言特點
Java數(shù)組
Java instanceof運(yùn)算符
Java包裝類
Java命令行參數(shù)
Java包
Java面向?qū)ο螅∣OP)概念
簡單Java程序
Java基礎(chǔ)實例程序
Java對象和類
Java continue語句
Java抽象類和接口的區(qū)別
C++ VS Java比較
Java if/else語句
Java switch語句
Java歷史
Java變量和數(shù)據(jù)類型
安裝Java環(huán)境(Linux)
Java JDK安裝和配置
Hello Java程序的內(nèi)部細(xì)節(jié)
Java break語句
Java方法重寫
Java Unicode編碼系統(tǒng)
怎么樣開始學(xué)習(xí)Java編程?
對象和類之間的區(qū)別
Java訪問修飾符
Java super關(guān)鍵字
Java注釋
JDK,JRE和JVM之間的區(qū)別
Java final關(guān)鍵字
Java static關(guān)鍵字

Java instanceof運(yùn)算符

java instanceof運(yùn)算符用于測試指定對象是否是指定類型(類或子類或接口)的實例。

java中的instanceof也稱為類型比較運(yùn)算符,因為它將類型與實例進(jìn)行比較。 它返回truefalse。 如果對任何具有null值的變量應(yīng)用instanceof運(yùn)算符,則返回false。

java instanceof的簡單示例

下面來看看實例運(yùn)算符的簡單示例,它測試當(dāng)前類。

class Simple1 {
    public static void main(String args[]) {
        Simple1 s = new Simple1();
        System.out.println(s instanceof Simple1);// true
    }
}

執(zhí)行上面試代碼,得到以下結(jié)果 -

true

子類類型的對象也是父類的類型。 例如,如果Dog擴(kuò)展了Animal,那么Dog的對象可以通過DogAnimal類來引用。

java instanceof運(yùn)算符的另一個例子

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
    }
}

執(zhí)行上面代碼,得到以下結(jié)果 -

true

instanceof測試null值的變量示例

如果我們對具有null值的變量應(yīng)用instanceof運(yùn)算符,則返回false。來看看下面給出的例子,將instanceof運(yùn)算符應(yīng)用于具有null值的變量。

class Dog2 {
    public static void main(String args[]) {
        Dog2 d = null;
        System.out.println(d instanceof Dog2);// false
    }
}

執(zhí)行上面代碼,得到以下結(jié)果 -

false

使用java instanceof運(yùn)算符的向下轉(zhuǎn)換

當(dāng)子類型引用父類的對象時,它被稱為向下轉(zhuǎn)換(downcasting)。 如果直接執(zhí)行它,編譯器會出現(xiàn)編譯錯誤。 如果通過類型轉(zhuǎn)換來執(zhí)行,在運(yùn)行時會拋出:ClassCastException 。 但是如果使用instanceof運(yùn)算符,可以進(jìn)行向下轉(zhuǎn)換。

Dog d=new Animal();//Compilation error

如果通過類型轉(zhuǎn)換執(zhí)行向下轉(zhuǎn)換,則在運(yùn)行時拋出:ClassCastException。

Dog d=(Dog)new Animal();  
//Compiles successfully but ClassCastException is thrown at runtime

使用instanceof進(jìn)行向下轉(zhuǎn)換

現(xiàn)在看看下面這個例子,通過instanceof運(yùn)算符進(jìn)行向下轉(zhuǎn)換。

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);
    }

}

執(zhí)行上面代碼,得到以下結(jié)果 -

ok downcasting performed

向下轉(zhuǎn)換不使用instanceof

也可以在不使用instanceof運(yùn)算符的情況下執(zhí)行下轉(zhuǎn)換,如以下示例代碼所示:

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);
    }
}

執(zhí)行上面代碼,得到以下結(jié)果 -

ok downcasting performed

仔細(xì)看看,被引用的實際對象是Dog類的對象。 所以如果向下轉(zhuǎn)換它,它是沒有問題的。 但是,如果也可以這樣寫:

Animal a=new Animal();  
Dog.method(a);  
//Now ClassCastException but not in case of instanceof operator

理解在java中使用instanceof的實例

這是一個instanceof的終極示例,通過下面的例子中的代碼看看instanceof關(guān)鍵字的真正用法。

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);
    }
}

執(zhí)行上面代碼,得到以下結(jié)果 -

b method