您的位置:首页 > 其它

instanceof,isInstance,isAssignableFrom的区别,以及isAssignableFrom()详解

2012-09-17 20:14 477 查看
一:isAssignableFrom详解,这个方法我觉得是不好理解,感觉命名不对劲,不知道是不是错觉

Class类的isAssignableFrom(Class cls)方法,如果调用这个方法的class或接口 与 参数cls表示的类或接口相同,或者是参数cls表示的类或接口的父类,则返回true。

形象地:自身类.class.isAssignableFrom(自身类或子类.class) 返回true

例如:

Object parent = new Object();
File child = new File(".");
parent.getClass().isAssignableFrom(child.getClass());//true


二:instanceof,inInstance,isAssignableFrom方法的区别:

测试程序:

package com.zizhu.rtti;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
//测试instanceof , isInstance,isAssignFrom
Super s = new Super();
Base b = new Base();
Deprive d = new Deprive();
test(s);
test(b);
test(d);
}

public static void test(Object x){
System.out.println("--------------------------------");
System.out.println("class : " + x.getClass().getName());
System.out.println("x instanceof Super : " + (x instanceof Super));
System.out.println("Super.isInstance(x) : " + (Super.class.isInstance(x)));
System.out.println("x.class.isAssignableFrom(Super) : " + (x.getClass().isAssignableFrom(Super.class)));
System.out.println("x instanceof Base : " + (x instanceof Base));
System.out.println("Base.isInstance(x) : " + (Base.class.isInstance(x)));
System.out.println("x.class.isAssignableFrom(Base) : " + (x.getClass().isAssignableFrom(Base.class)));
System.out.println("x instanceof Deprive : " + (x instanceof Deprive));
System.out.println("Deprive.isInstance(x) : " + (Deprive.class.isInstance(x)));
System.out.println("x.class.isAssignableFrom(Deprive) : " + (x.getClass().isAssignableFrom(Deprive.class)));
}

}


输出结果:

--------------------------------
class : com.zizhu.rtti.Super
x instanceof Super : true
Super.isInstance(x) : true
x.class.isAssignableFrom(Super) : true
x instanceof Base : false
Base.isInstance(x) : false
x.class.isAssignableFrom(Base) : true
x instanceof Deprive : false
Deprive.isInstance(x) : false
x.isAssignableFrom(Deprive) : true
--------------------------------
class : com.zizhu.rtti.Base
x instanceof Super : true
Super.isInstance(x) : true
x.class.isAssignableFrom(Super) : false
x instanceof Base : true
Base.isInstance(x) : true
x.class.isAssignableFrom(Base) : true
x instanceof Deprive : false
Deprive.isInstance(x) : false
x.isAssignableFrom(Deprive) : true
--------------------------------
class : com.zizhu.rtti.Deprive
x instanceof Super : true
Super.isInstance(x) : true
x.class.isAssignableFrom(Super) : false
x instanceof Base : true
Base.isInstance(x) : true
x.class.isAssignableFrom(Base) : false
x instanceof Deprive : true
Deprive.isInstance(x) : true
x.isAssignableFrom(Deprive) : true


可以看出,instanceof和isInstance这两个方法基本上是等价的,都可以判定类或者子类的实例是否是属于某个类,偏向于向上比较(父类);而isAssignableFrom则偏向于向下比较(子类),而且isAssignableFrom比较的不是实例,而是类本身的层次结构,倾向于类本身,而不是实例;如:Object.class.isAssignableFrom(File.class)//true;另外2个方法则倾向于比较实例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: