Java 中的 instanceof 运算符用于测试一个对象是否是指定类型(类、子类或接口)的实例。

instanceof 运算符返回一个布尔值,即 true 或 false。如果对象是指定类型的实例,则返回 true;否则返回 false。如果将 instanceof 运算符应用于一个具有 null 值的变量,它将返回 false。

java instanceof 的简单示例

让我们来看一个简单的示例,演示了如何使用 instanceof 运算符来测试当前对象的类型。

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

输出:

true

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

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 

java中的instanceof带有一个具有空值的变量

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

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

输出:

false 

使用 java instanceof 运算符进行向下转换

当子类类型引用父类对象时,称为向下转型。如果直接执行向下转型,编译器将会报错。如果通过类型转换执行向下转型,那么在运行时可能会抛出 ClassCastException 异常。然而,如果我们使用 instanceof 运算符进行类型检查,就可以避免抛出异常,从而安全地进行向下转型。

Dog d=new Animal();//编译错误 

如果我们通过类型转换执行向下转换,则在运行时会抛出 ClassCastException。

Dog d=(Dog)new Animal();  
//编译成功但运行时抛出ClassCastException   

使用 instanceof 向下转型的可能性

让我们看一下示例,其中 instanceof 运算符可以进行向下转换。

class Animal { }  
  
class Dog3 extends Animal {  
  static void method(Animal a) {  
    if(a instanceof Dog3){  
       Dog3 d=(Dog3)a;//向下转型 
       System.out.println("向下转换执行成功");  
    }  
  }  
  
  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;//向下转型
       System.out.println("向下转换执行成功");  
  }  
   public static void main (String [] args) {  
    Animal a=new Dog4();  
    Dog4.method(a);  
  }  
}  

输出:

向下转换执行成功

让我们仔细看看 a 引用的实际对象是 Dog 类的对象。所以如果我们向下转换它,那很好。但是如果我们这样写会发生什么:

Animal a=new Animal();  
Dog.method(a);  
//现在是 ClassCastException 但不是在 instanceof 运算符的情况下 

理解instanceof在java中的真正使用

让我们通过下面给出的例子看看 instanceof 关键字的真正用法。

interface Printable{}  
class A implements Printable{  
public void a(){System.out.println("A方法");}  
}  
class B implements Printable{  
public void b(){System.out.println("B方法");}  
}  
  
class Call{  
void invoke(Printable p){ //向上转型 
if(p instanceof A){  
A a=(A)p;//向下转型  
a.a();  
}  
if(p instanceof B){  
B b=(B)p;//向下转型  
b.b();  
}  
}  
} //调用类结束 
  
class Test4{  
public static void main(String args[]){  
Printable p=new B();  
Call c=new Call();  
c.invoke(p);  
}  
}  

输出:

B方法

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想