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

Java基础

浏览数:177

2019-7-20

AD:资源代下载服务

一、前言

  • 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!

作者:Shonan