转载

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

一、前言

1.1、instanceof
1.2、
1.3、

二、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!
原文  https://segmentfault.com/a/1190000019782422
正文到此结束
Loading...