zoukankan      html  css  js  c++  java
  • instanceof 和 isInstance 强转 类型 class [MD]

    博文地址

    我的GitHub 我的博客 我的微信 我的邮箱
    baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

    目录

    简介

    区别:

    • instanceof 是一个运算符,用来判断前面的对象是不是后面指定的类型
    • isInstance 是 Class 类的一个方法,用来判断指定的对象是否可以强转为当前类型

    Class.isInstance 官方文档描述:

    • 判定指定的 Object 是否与此 Class 所表示的对象赋值兼容
    • 此方法是 Java 语言 instanceof 运算符的动态等效方法
    • 如果指定的 Object 参数非空,且能够在不引发 ClassCastException 的情况下被强制转换成该 Class 对象所表示的引用类型,则该方法返回 true;否则返回 false。
    • 特别地:
      • 当该 Class 对象表示一个已声明的时,若指定的 Object 参数是所表示类(或其任一子类)的一个实例,则此方法返回 true;否则返回 false
      • 如果此 Class 对象表示一个数组类,且通过身份转换或扩展引用转换,指定的 Object 参数能转换为一个数组类的对象,则返回 true;否则返回 false
      • 如果此 Class 对象表示一个接口,且指定 Object 参数的类或任一超类实现了此接口,则此方法返回 true;否则返回 false
      • 如果此 Class 对象表示一个基本类型,则此方法返回 false

    最重要的一句话:凡是 null 相关的都是 false

    测试

    继承关系

    interface IPeron {
    }
    
    class Father implements IPeron {
    }
    
    class Child extends Father {
    }
    

    测试案例

    基本测试

    System.out.println("------------基本测试------------");
    Child child = new Child(); //只要能强转就为 true;反过来,只要为 true,我们就能安全的强转
    System.out.println(child instanceof Child && child instanceof Father && child instanceof IPeron && child instanceof Object);//true
    System.out.println(Child.class.isInstance(child) && Father.class.isInstance(child) && IPeron.class.isInstance(child) && Object.class.isInstance(child));//true
    

    测试多态

    System.out.println("------------测试多态------------");
    IPeron peron = new Child();
    System.out.println(peron instanceof Child && peron instanceof Father && peron instanceof IPeron && peron instanceof Object);//true
    

    测试null

    System.out.println("------------测试null------------");
    Father father = null; //凡是null相关的都是false
    System.out.println(null instanceof Object || Object.class.isInstance(null) || father instanceof Object || Object.class.isInstance(father)); //false
    Child nullChild = (Child) father; //这样是没问题的
    //String nullString = (String) father; //编译不通过。Error:(39, 38) java: 不兼容的类型: Father无法转换为java.lang.String
    

    测试数组

    System.out.println("------------测试数组------------");
    Child[] children = new Child[]{};
    System.out.println(children instanceof Child[] && children instanceof Father[] && children instanceof IPeron[] && children instanceof Object[]);//true
    System.out.println(Child[].class.isInstance(children) && Father[].class.isInstance(children) && IPeron[].class.isInstance(children) && Object[].class.isInstance(children));//true
    System.out.println(new Father[]{} instanceof Child[]); //false
    

    测试集合

    System.out.println("------------测试集合------------");
    List<Child> childList = new ArrayList<>();
    System.out.println(childList instanceof List && childList instanceof ArrayList && List.class.isInstance(childList) && ArrayList.class.isInstance(childList));//true
    

    测试基本类型

    System.out.println("------------测试基本类型------------");
    int i = 0;
    Integer integer = 0;
    //System.out.println(i instanceof Object);//编译不通过
    System.out.println(integer instanceof Integer && integer instanceof Object);//true
    System.out.println(Integer.class.isInstance(i) && Object.class.isInstance(i) && Integer.class.isInstance(integer) && Object.class.isInstance(integer)); // true
    System.out.println(int.class.isInstance(i) || int.class.isInstance(integer)); // false。如果此 Class 对象表示一个基本类型,则此方法返回 false
    

    打印结果

    ------------基本测试------------
    true
    true
    ------------测试多态------------
    true
    ------------测试null------------
    false
    ------------测试数组------------
    true
    true
    false
    ------------测试集合------------
    true
    ------------测试基本类型------------
    true
    true
    false
    

    2019-11-17

  • 相关阅读:
    第十次作业
    第九次作业总结
    第九次作业
    第八次作业总结
    第七次作业总结
    第六次总结
    第十二次作业总结
    第十一次作业总结
    第十次作业总结
    第九次作业总结
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/11877327.html
Copyright © 2011-2022 走看看