java----getClass(),instanceof,isAssignableFrom()区别
结论
| getClass() | instanceof | isAssignableFrom() |
|---|---|---|
| 获取类 | 判断是否实例 | 判断是否可转化 |
| 相同的类返回true | 相同的类,子类,实现类都可以返回true | 父类.isAssignableFrom(子类)返回true |
isAssignableFrom()方法与instanceof关键字的区别总结为以下两个点:
- isAssignableFrom()方法是从类继承的角度去判断,instanceof关键字是从实例继承的角度去判断。
- isAssignableFrom()方法是判断是否为某个类的父类,instanceof关键字是判断是否某个类的子类。
上代码
public interface SomeInterface {
}
public class Father implements SomeInterface{
}
public class Child extends Father{
}
getClass()
public static void main(String[] args) {
Child child = new Child();
Father father = new Father();
testGetClass(father);
testGetClass(child);
}
public static void testGetClass(Object o){
log.info("o.getClass Father:{}",o.getClass()==Father.class);
log.info("o.getClass Child:{}",o.getClass()==Child.class);
}
结果
19:36:04.616 [main] INFO - o.getClass Father:true
19:36:04.619 [main] INFO - o.getClass Child:false
19:36:04.619 [main] INFO - o.getClass Father:false
19:36:04.619 [main] INFO - o.getClass Child:true
结论getClass()必须是相同的类
instanceof
public static void main(String[] args) {
Child child = new Child();
Father father = new Father();
testInstanceOf(father);
testInstanceOf(child);
}
/**
* 判断是类型的实例,包括实现类
* @param o
*/
public static void testInstanceOf(Object o){
log.info("o instanceof Father:{}",o instanceof Father);
log.info("o instanceof Child:{}",o instanceof Child);
log.info("o instanceof SomeInterface:{}",o instanceof SomeInterface);
}
结果
19:36:04.619 [main] INFO - o instanceof Father:true
19:36:04.619 [main] INFO - o instanceof Child:false
19:36:04.619 [main] INFO - o instanceof SomeInterface:true
19:36:04.619 [main] INFO - o instanceof Father:true
19:36:04.619 [main] INFO - o instanceof Child:true
19:36:04.619 [main] INFO - o instanceof SomeInterface:true
结论instanceof可以是同一个类,子类或实现类
isAssignableFrom()
public static void main(String[] args) {
Child child = new Child();
Father father = new Father();
testIsAssignableFrom(father);
testIsAssignableFrom(child);
}
/**
* 父类 isAssignableFrom 子类
* @param o
*/
public static void testIsAssignableFrom(Object o){
log.info("Father.class.isAssignableFrom:{}",Father.class.isAssignableFrom(o.getClass()));
log.info("Child.class.isAssignableFrom:{}",Child.class.isAssignableFrom(o.getClass()));
log.info("SomeInterface.class.isAssignableFrom:{}",SomeInterface.class.isAssignableFrom(o.getClass()));
log.info("isAssignableFrom Father: {}",o.getClass().isAssignableFrom(Father.class));
log.info("isAssignableFrom Child: {}",o.getClass().isAssignableFrom(Child.class));
log.info("isAssignableFrom SomeInterface: {}",o.getClass().isAssignableFrom(SomeInterface.class));
}
结果
19:36:04.619 [main] INFO - Father.class.isAssignableFrom:true
19:36:04.619 [main] INFO - Child.class.isAssignableFrom:false
19:36:04.619 [main] INFO - SomeInterface.class.isAssignableFrom:true
19:36:04.619 [main] INFO - isAssignableFrom Father: true
19:36:04.619 [main] INFO - isAssignableFrom Child: true
19:36:04.619 [main] INFO - isAssignableFrom SomeInterface: false
19:36:04.619 [main] INFO - Father.class.isAssignableFrom:true
19:36:04.619 [main] INFO - Child.class.isAssignableFrom:true
19:36:04.619 [main] INFO - SomeInterface.class.isAssignableFrom:true
19:36:04.619 [main] INFO - isAssignableFrom Father: false
19:36:04.619 [main] INFO - isAssignableFrom Child: true
19:36:04.619 [main] INFO - isAssignableFrom SomeInterface: false
结论isAssignableFrom()必须父类 isAssignableFrom() 子类
1164





