instanceof与Class的等价性

    在查询类型信息时,以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


你可能感兴趣的:(Java基础)