【Java】instanceof 关键字

instanceof 通过返回一个布尔值来指出,某个对象是否是某个特定类或者是该特定类的子类的一个实例。

  1. 如果 object 是class 的一个实例,则 instanceof 运算符返回 true,如果 object 不是指定类的一个实例,或者object 是null, 则返回false。class 可以是类,可以是接口。
  2. instanceof 在Java 的编译状态 和 运行状态是有区别的:
  • 在编译状态中,class(指的是对象的引用)可以是object对象、父类,自身类,子类。在这三种情况下Java编译时不会报错。
  • 在运行状态中,class 可以是 object 对象,父类,自身类,不能其他是子类。在前面三种情况下 result 的结果为 true,最后一种为false。但是class为子类时编译不会报错。运行结果为false.(大致就是判断表达式:class 变量=(class)object的引用 是否立)。

 示例代码:

AnimalParent.java

package com.api.Demo06;

public class AnimalParent {
//public interface AnimalParent { //也可以时接口
}

Cat.java

package com.api.Demo06;

public class Cat extends AnimalParent{
//public class Cat implements AnimalParent{
}

Dog.java

package com.api.Demo06;

public class Dog extends AnimalParent{
//public class Dog implements AnimalParent{
}

Test.java

package com.api.Demo06;

public class Test01 {
    public static void main(String[] args) {
        //多态技术
        AnimalParent cat = new Cat();
        // 类型转换异常
//        Dog dog = (Dog) cat; //com.api.Demo06.Cat cannot be cast to com.api.Demo06.Dog

        // if(对象的引用 instanceof 具体的类型(类或接口))
        if (cat instanceof Dog) { //返回 布尔类型 是该类型 返回true,不是则返回false
            System.out.println("cat 是 Dog 类型");
        } else {
            System.out.println("cat 不是 Dog 类型");
        }
        /**
         * cat instanceof Dog 不是
         * cat instanceof Cat||AnimalParent||Object 是
         * 在编译状态中,class(对象的引用)可以是object对象的父类(AnimalParent),自身类(Cat),子类。
         * 在这三种情况下Java编译时不会报错。
         */

        // 强转时 程序可能会直接 抛出异常,所以可以使用 instanceof 判断一下
        if (cat instanceof Dog) {
            Dog dog = (Dog) cat;
            System.out.println("类型符合,可以强转");
        } else {
            System.out.println("类型不符,不能强转");
        }
    }
    /**
     * 在运行状态中,class 可以是 object 对象的父类(AnimalParent),自身类(Cat),不能是其他的子类(Dog、)。
     * 在前面两种情况下 result 的结果为 true,最后一种为false。
     */
}

下一篇文章:

你可能感兴趣的:(java,开发语言,instanceof)