instanceof关键字讲解(含Java实例演示

前言:

        最近我正在系统性地过一遍Java的基础,在学习过程中,发现instanceof关键字有些地方不是很清晰,想要探究一些特殊情况下他的返回值,比如说在多态的条件下,这个关键字是如何判定的。接下来就对instanceof这个关键字进行讲解,以及实例演示。

正文:

        首先来讲讲instanceof这个关键字的作用:

        instanceof,它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。

在Java中instanceof在判断时会有两种状态,一种是在编译状态下报错,另一种就是在运行状态下返回true 和 false。

那么什么时候会在编译的时候就报错呢,和返回false的区别在哪?

  • 在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
  • 在运行状态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下返回的结果为true,最后一种为false。但是class为子类时编译不会报错,也就是有关系的情况下,不会报错。

不过这篇文章更多的是探讨多态的情况下,instanceof该怎么判断?

先上代码:

public class InstanceTest1 {
    public static void main(String[] args) {
        Person p1 = new Student();
        Person p2 = new Person();
        Student s1 = new Student();

        System.out.println(p1 instanceof Object);  //true
        System.out.println(p1 instanceof Person);  //true
        System.out.println(p1 instanceof Student);  //true
        System.out.println(p1 instanceof Teacher);  //false
        //System.out.println(p1 instanceof Car);  编译就报错了
        System.out.println("=======================");
        System.out.println(p2 instanceof Object);  //true
        System.out.println(p2 instanceof Person);  //true
        System.out.println(p2 instanceof Student);  //false
        System.out.println(p2 instanceof Teacher);  //false
        System.out.println("=======================");
        System.out.println(s1 instanceof Object);  //true
        System.out.println(s1 instanceof Person);  //true
        System.out.println(s1 instanceof Student);  //true
        //System.out.println(s1 instanceof Teacher);  编译报错
        //System.out.println(s1 instanceof Car);    编译报错

    }
}
class Person {


}
class Student extends Person{

}
class Teacher extends Person{

}
class Car{

}

在这份代码中总共有四个类:Person、Student、Teacher、Car

其中Student和Teacher都是Person的子类,而Car与其三者皆无关

从代码的实验中总结出来在多态的情况下的几条规则:

在编译状态下:

  • class可以是引用类型的父类、自身类、子类,简而言之有关系就行,爷爷类都行,在有关系的情况下Java编译时就不会报错。

在运行状态下:

  • 是以创建的实际的对象类型来确定的,比如说p1, p1的引用类型是Person,但是创建的实际类型却是Student,在运行状态下,是以Student类为主的。在运行状态下,class可以是实际对象类型的父类、自身类、子类。比自己等级高的包括自身类都返回true,属于自己的子类或者兄弟类的都返回false。在代码中可以看到,p2  instanceof  Student 返回的是false,p2的实际类型是Person,然而Student是他的子类,所以返回false。

总的来说,instanceof就是用来判断该对象是否是右边的类或者右边类的子类所创建的,如果是则返回true,否则返回false。

那么讲到这里,我们的instanceof到底有什么具体应用呢?

使用同一个方法,然后根据你所创建的对象,去判断属于哪一个类,然后应该执行哪一个操作,可以说也是多态的一种体现方式,主要是结合方法一起使用,方法的参数那里可以填Object obj,这样,通过传入的对象再在方法内进行判断。主要还是使用多态的方式去调用方法。所以,instanceof还是很重要的,在多态调用方法的时候起到一个核心的作用。

总结:

        instanceof这个关键字主要是体现Java特性中的多态,主要还是在多态里应用,大家可以通过日后遇到的实际问题再去加深对instanceof实际应用的理解。这里就是我自己对于instanceof这个关键字的理解,如果有什么谬误还请各位大佬指正,感谢万分

你可能感兴趣的:(Java学习日志,java,开发语言,后端,多态,instanceof)