问:简单说说 java instanceof 的作用与 Class.isInstance 的区别?
答:java 中的 instanceof 运算符用来在运行时指出对象是否是特定类的一个实例,通过返回一个布尔值来指出这个对象是否是这个特定类或者是它的子类的一个实例;用法为 result = object instanceof class,参数 result 布尔类型,object 为必选项的实例,class 为必选项的任意已定义的对象类,如果 object 是 class 的一个实例则 instanceof 运算符返回 true,如果 object 不是指定类的一个实例或者 object 是 null 则返回 false;但是 instanceof 在 java 的编译状态和运行状态是有区别的,在编译状态中 class 可以是 object 对象的父类、自身类、子类,在这三种情况下 java 编译时不会报错,在运行转态中 class 可以是 object 对象的父类、自身类但不能是子类,当为父类、自生类的情况下 result 结果为 true,为子类的情况下为 false。
Class.isInstance(obj) 表明这个对象能不能被转化为这个类,如果 obj 是调用这个方法的 Class 或接口的实例则返回true,这个方法是 instanceof 运算符的动态等价,如果 obj 为 null 则返回 false。
下面给出一个代码片段实例作为补充理解:
class ClassA {}
class ClassB extends ClassA {}
//运行块
ClassB b = new ClassB();
ClassA a = new ClassA();
ClassA ba = new ClassB();
System.out.println(b instanceof ClassB); //true
System.out.println(b instanceof ClassA); //true
System.out.println(b instanceof Object); //true
System.out.println(null instanceof Object); //false
System.out.println(b.getClass().isInstance(b)); //true
System.out.println(b.getClass().isInstance(a)); //false
System.out.println(a.getClass().isInstance(ba)); //true
System.out.println(b.getClass().isInstance(ba)); //true
System.out.println(b.getClass().isInstance(null)); //false
System.out.println(ClassA.class.isInstance(a)); //true
System.out.println(ClassA.class.isInstance(b)); //true
System.out.println(ClassA.class.isInstance(ba)); //true
System.out.println(ClassB.class.isInstance(a)); //false
System.out.println(ClassB.class.isInstance(b)); //true
System.out.println(ClassB.class.isInstance(ba)); //true
System.out.println(Object.class.isInstance(b)); //true
System.out.println(Object.class.isInstance(null)); //false
本问题关联历史推送问题如下:
《【码农每日一题】Java instanceof 关键词基础面试题》
看完不过瘾?看完还想看?那就点击左下角阅读原文查看本号历史经典技术知识点题目推送,解锁更多基础知识~