instanceof 与 Class.isInstance(Object obj)

问:简单说说 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

子类可以转化为父类,父类不能转化为子类。

你可能感兴趣的:(instanceof 与 Class.isInstance(Object obj))