在查询类型信息时,以instanceof的形式(即以instanceof的形式或isInstance()的形式)与直接比较Class对象有一个很重要的差别。instanceof保持了类型的概念,它指的是 你是这个类或者这个类的派生类吗?而用==比较实际的Class对象,就没有考虑继承,它或者是这个确切的类型,或者不是。
package com.aijie.typeinfo;
/**
* @author E-mail:
* @version 2018年6月2日 下午7:41:45
*/
class Base{}
class Derived extends Base{}
public class FamilyVsExactType {
static void test(Object x){
System.out.println("Testing x of type "+x.getClass());
System.out.println("x instanceof Base "+(x instanceof Base));
System.out.println("x instanceof Derived "+(x instanceof Derived));
System.out.println("Base.isInstance(x) "+Base.class.isInstance(x));
System.out.println("Derived.isInstance(x) "+Derived.class.isInstance(x));
System.out.println("x.getClass() == Base.class "+(x.getClass() == Base.class));
System.out.println("x.getClass() == Derived.class "+(x.getClass() == Derived.class));
System.out.println("x.getClass().equals(Base.class)"+(x.getClass().equals(Base.class)));
System.out.println("x.getClass().equals(Derived.class)"+(x.getClass().equals(Derived.class)));
}
public static void main(String[] args) {
test(new Base());
test(new Derived());
}
}
Testing x of type class com.aijie.typeinfo.Base
x instanceof Base true
x instanceof Derived false
Base.isInstance(x) true
Derived.isInstance(x) false
x.getClass() == Base.class true
x.getClass() == Derived.class false
x.getClass().equals(Base.class)true
x.getClass().equals(Derived.class)false
Testing x of type class com.aijie.typeinfo.Derived
x instanceof Base true
x instanceof Derived true
Base.isInstance(x) true
Derived.isInstance(x) true
x.getClass() == Base.class false
x.getClass() == Derived.class true
x.getClass().equals(Base.class)false
x.getClass().equals(Derived.class)true