📅  最后修改于: 2020-09-24 01:17:12             🧑  作者: Mango
javainstanceof运算符用于测试对象是否是指定类型(类,子类或接口)的实例。
在Java中的instanceof也被称为类型运算符,因为它的实例与类型进行比较。它返回true或false。如果我们对任何具有null值的变量应用instanceof运算符,则它将返回false。
让我们看一下实例运算符的简单示例,它在其中测试当前类。
class Simple1{
public static void main(String args[]){
Simple1 s=new Simple1();
System.out.println(s instanceof Simple1);//true
}
}
子类类型的对象也是父类的类型。例如,如果Dog扩展了Animal,则Dog或Animal类可以引用Dog的对象。
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
}
}
如果我们将instanceof运算符与具有空值的变量一起应用,则它将返回false。让我们看看下面给出的示例,其中我们将instanceof运算符与具有空值的变量一起应用。
class Dog2{
public static void main(String args[]){
Dog2 d=null;
System.out.println(d instanceof Dog2);//false
}
}
当子类类型引用父类的对象时,称为向下转换。如果直接执行,编译器将给出编译错误。如果通过类型转换执行它,则在运行时将引发ClassCastException。但是,如果我们使用instanceof运算符,则向下转换是可能的。
Dog d=new Animal();//Compilation error
如果我们通过类型转换执行向下转换,则会在运行时引发ClassCastException。
Dog d=(Dog)new Animal();
//Compiles successfully but ClassCastException is thrown at runtime
让我们看一下示例,其中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);
}
}
向下转换也可以不使用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);
}
}
让我们仔细看看,a引用的实际对象是Dog类的对象。因此,如果我们对此不满意,那就很好。但是如果我们写:
Animal a=new Animal();
Dog.method(a);
//Now ClassCastException but not in case of instanceof operator
通过下面给出的示例,让我们看看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);
}
}