java instanceof運算子。
阿新 • • 發佈:2018-12-08
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