首页 > 代码库 > java中运算符instanceOf和Class<?>.isInstance的对比

java中运算符instanceOf和Class<?>.isInstance的对比

辨析一个类和一个实例是不是具有实现关系,通常使用 instanceOF和Class<?>.isInstanceOf(obj),为了能够更好的使用这2中方式,我们需要知道两者的差别。

//通常我们会用到下面的关系,instanceOf说明了类和对象的直接实现关系
if(obj instanceOf ObjClass)
{
//..  
}

//这种关系是如何实现的呢
//首先obj 是ObjClass的实例的话,那么obj必须是非空,所以 obj!=null,其次,obj.getClass()==ObjClass.class

//所以如上等价于
if(obj!=null && obj.getClass()==ObjClass.class)
{
//
}

//上面使用了 == 而不是equal,因为这更加合理,在java中,类是静态的,唯一的,共享的单例,所以这里用 == 在恰当不过了,使用 == 更能说明 实现关系.

那么 Class<?>.isInstanceOf(obj)是如何实现的呢

ObjClass.getClass().isInstance(obj)其实是由 类型->对象的查询,说明了类和对象的间接实现关系。

当一个类继承了某个接口,类,或者而是抽象类,那么,isInstanceOf旨在查找出,这个对象到底实现了哪些类,说着比较绕口。

interface I{

} 
class A implements I{

}

class B extends A
{

}

B b = new B();

I.class.isInstance(b); //查询 b是不是实现了接口I true
A.class.isInstance(b);//查询b是不实现了A类  true
B.class.inInstance(b);//查询b是不实现了B类  true

其实现是一层一层的查询(java源码使用native code 缩写,这里也不写代码解释了,就是调用下面的方法逐步查询的)
//查询的停止位置是 Object.class
if(a==null)
{
  return false;
}

if(a.getClass()==I.class)
{
  return true;
}

if(a.getClass().getSuperclass()==I.class || a.getClass().getInterfaces()==I.class){
  return true;
}
.....

//如果查询得到的话返回 true;
//否则在java.lang.Object.class处终止




java中运算符instanceOf和Class<?>.isInstance的对比