Java教程-详解 Java instanceof 关键字

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方法