📜  Java instanceof运算符

📅  最后修改于: 2020-09-24 01:17:12             🧑  作者: Mango

Java instanceof

javainstanceof运算符用于测试对象是否是指定类型(类,子类或接口)的实例。

在Java中的instanceof也被称为类型运算符,因为它的实例与类型进行比较。它返回true或false。如果我们对任何具有null值的变量应用instanceof运算符,则它将返回false。

Java instanceof的简单示例

让我们看一下实例运算符的简单示例,它在其中测试当前类。

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

子类类型的对象也是父类的类型。例如,如果Dog扩展了Animal,则Dog或Animal类可以引用Dog的对象。

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

java中的instanceof,其变量具有空值

如果我们将instanceof运算符与具有空值的变量一起应用,则它将返回false。让我们看看下面给出的示例,其中我们将instanceof运算符与具有空值的变量一起应用。

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

使用Java instanceof 运算符向下转换

当子类类型引用父类的对象时,称为向下转换。如果直接执行,编译器将给出编译错误。如果通过类型转换执行它,则在运行时将引发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);  
  }  
     }  

不使用Java 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);  
  }  
}  

让我们仔细看看,a引用的实际对象是Dog类的对象。因此,如果我们对此不满意,那就很好。但是如果我们写:

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

了解Java中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);  
}  
}