Java instanceof用法

1 什么Java的instanceof运算符

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

2 instanceof的简单示例1

让我们看一下instanceof运算符的简单示例:

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Simple1{
    public static void main(String args[]){
        Simple1 s=new Simple1();
        System.out.println(s instanceof Simple1);//返回true
    }
}

输出结果为:

true

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

3 instanceof的简单示例2

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Animal{}
class Dog1 extends Animal{//Dog继承了Animal

    public static void main(String args[]){
        Dog1 d=new Dog1();
        System.out.println(d instanceof Animal);//返回true
    }
}

输出结果为:

true

4 Java的instanceof判断NULL变量

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

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Dog2{
    public static void main(String args[]){
        Dog2 d=null;
        System.out.println(d instanceof Dog2);//返回false
    }
}

输出结果为:

false

5 Java的instanceof向下转换

当子类类型指向父类的对象时,称为向下转换。如果直接执行,编译器将报出编译错误。如果通过类型转换,则在运行时将引发ClassCastException异常。但是,如果我们使用instanceof运算符,则可以向下转换。

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

如果我们通过类型转换向下转换,则会在运行时引发ClassCastException异常。

Dog d=(Dog)new Animal();  
//编译成功,但是运行时报出ClassCastException异常

5.1 使用instanceof进行向下转换

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

/**
 * 一点教程网 - http://www.yiidian.com
 */
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);
    }

}

输出结果为:

向下转换成功

5.2 不使用instanceof进行向下转换

向下转换也可以不使用instanceof运算符,如以下示例所示:

/**
 * 一点教程网 - http://www.yiidian.com
 */
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类的对象。因此,我们进行类型转换是没问题的。但是如果我们这样写就会报ClassCastException异常:

Animal a=new Animal();  
Dog.method(a);  
//现在这样写会报ClassCastException异常,如果使用instanceof判断就能避免异常发生 

6 Java的instanceof的实际应用

通过下面给出的示例,让我们看一下instanceof关键字的实际应用。

/**
 * 一点教程网 - http://www.yiidian.com
 */
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方法

 

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码