1. 程式人生 > >java instanceof運算子。

java instanceof運算子。

Java instanceof運算子


instanceof運算子用於測試指定物件是否是指定型別(類或子類或介面)的例項,它返回true或false。 如果對任何具有null值的變數應用instanceof運算子,則返回false。

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

輸出結果

true

因為s是Simple類的例項物件,所以為true。
如果用null值測試

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

返回

false

轉型:
向下轉型:

 Animal a = new Dog(); 

向上轉型:

 Dog d = new Animal();                                            //向上轉型會報錯,丟擲ClassCastException異常

同時也不能強轉

 Dog d = (Dog)new Animal();                                   //丟擲異常,並不能強轉原生的Animal類物件

但是可以強轉向下轉型後的物件,例如:

Animal a = new Dog();                                                //提升為Animal,但是引用的是dog物件。
Dog d = (Dog) a;                                                         //引用的是Dog物件就可以強轉成Dog物件。

但是

Animal a = new Dog();                                      //提升為Animal,但是引用的是dog物件。            
a = new Animal();                                             //之後又引用到Animal物件 。 
Dog d = (Dog) a;                                               //當然Animal物件是不能強轉成Dog物件的。

總之能否強轉,看被強轉型別是否和將要強轉的型別相同就可以了。如果實在不知道能否強轉就使用instanceof判斷一下,若instanceof返回true,就可以強轉,反之不行。

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

示例

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