辨析一个类和一个实例是不是具有实现关系,通常使用 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处终止
时间: 2024-10-05 07:33:37