乐趣区

Java深入理解instanceof绝对让你有新发现

一、前言

  • 1.1、instanceof 是 Java 的保留关键字,一个二元操作符(和 ==,>,< 是同一类东东)
  • 1.2、作用:测试它左边的对象是否是它右边的类的实例
  • 1.3、返回值:返回 boolean 的数据类型。
  • 接下来通过本文给大家介绍 Java 中的 instanceof 用法详解及 instanceof 是什么意思,需要的朋友参考下吧

二、instanceof 的说明、解释

  • 2.1、说明:

    • (1). 一个类的 实例 包括本身的实例, 以及所有直接或间接子类的实例
    • (2).instanceof 左边操作元显式声明的类型与右边操作元必须是 同种类 或有 继承关系, 即位于继承树的同一个分支上, 否则会编译出错!
  • 2.2、

    • 2.2.1_demo01_

      double obj = 1;
      if (obj instanceof Double)
          System.out.println("true");      // 无输出 --> 不成立
      
      • 编译信息: Incompatible conditional operand types double and Double 错误
      • 分析:obj 必须是对象的实例。不能是基础数据类型。
    • 2.2.2_demo02_

      String obj = 1.0 + "";
      if (obj instanceof Double)
          System.out.println("true");    // 无输出:
      • 编译信息:Incompatible conditional operand types String and Double” 错误
      • 分析:String 和 Double 不是位于继承树的 同一个分支 上。
    • 2.2.3_demo03_

      if(null instanceof Object)
          System.out.println("true");    
      else
          System.out.println("false");
      // 输出:false
      String obj = null;
      
      if (obj instanceof Object){System.out.println("true");
      else
          System.out.println("false");
      // 输出:false
      • 分析:null 用操作符 instanceof 测试任何类型时都是返回 false 的
    • 2.2.4_demo04_

      String obj = null;
      if (obj instanceof null)
          System.out.println("true");
      else
          System.out.println("false");
      • 编译信息:Syntax error on token “null”, invalid ReferenceType” 标记 ”null” 上的语法错误,无效引用类型
    • 2.2.5_demo05_:前方高能,务必仔细阅读!!!

       class Student {}
       public class Test {public static void main(String[] args){
               // 第 1 组
               System.out.println(new Student() instanceof String);    // 编译时错误
               System.out.println(new Student() instanceof Exception); // 编译时错误
               System.out.println(new Student() instanceof Object);   // 输出时 true
               // 第 2 组
               System.out.println(new Student() instanceof List);    // 输出 false
               System.out.println(new Student() instanceof List<?>); // 输出 false
               System.out.println(new Student() instanceof List<String>); // 编译错误
               System.out.println(new Student() instanceof List<Object>); // 编译错误
               // 第 3 组
               System.out.println(new String() instanceof List);    // 编译错误
               System.out.println(new String() instanceof List<?>); // 编译错误
               // 第 4 组
               System.out.println(null instanceof Object);      // 输出错误,同 demo03
          }
      }
      • 分析:

        • 对于第 1 组:与下面一起论述
        • 对于第 2 组:
        • 疑惑 1:为什么用 student() 测试 String 时编译报错,测试 List 的时编译通过

          • 猜测 :(1) 难道是 instanceof 对 接口 在编译时不作检查呢,(2)还是由于 List 类型本身在编译时不确定具体类型导致的
          • 推翻猜测:与第 3 组用 String 对象测试 List<> 和 List<?> 时结果大不相同
          • 论据 :翻看 Java 书籍时发现:instanceof 的这些表现都是跟cast 操作符是有点关系的,就是说当我们在 instanceof 方法时,编译器会检查这个对象能够 cast 到右边的类型。如果不能 cast 则直接报错,如果不能 确定 类型,则通过编译,具体看 运行时 定。
        • 疑惑2:Student 已经确定类型了啊,List 类型也是确定的啊,为什么能够编译通过呢,而 String 却不行呢?“

          • 猜测:难道是自己定义的类和系统定义的类在编译处理上有不同?
          • 推论 :可能是因为 final 关键字的区别造成的,我们发现不论String、Integer、Long 等都是 最终类,他们的处理类似于编译器对常量的处理,故而可以通过编译
          • 论据 :其实当我们在自定义的类前面加上final 关键字的时候,其表现就跟 String、Integer、Long 这些最终类测试 instanceof 表现的一样了。

三、instanceof 的用法

  • 用法:result = object instanceof class
  • 参数:

    • result:布尔类型值
    • object:类的对象
    • class:对象类
  • 说明:如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。

四、综述

  • 相信任何一个认真读完以上内容的人都会对 instanceof 的用法、理解更加深刻!
  • 希望作者的文章可以被您采纳!您的支持是作者坚持的无限动力!Thanks!
退出移动版