Java instanceof運算符

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

java中的instanceof也稱爲類型比較運算符,因爲它將類型與實例進行比較。 它返回truefalse。 如果對任何具有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的對象可以通過DogAnimal類來引用。

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

理解在java中使用instanceof的實例

這是一個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