1.instanceof:比较的是继承关系或者实现关系的类类型,子类对象或者实现类对象放在前面,例如:
class A{}
class B extends A{}
B b = new B();
b instanceof A
2.getClass():比较任何类的类型(两个毫不相干的类型,当然这也没啥意义),也可以通过isAssignableFrom(Class<?> cls)方法比较,以下是API原意:
判定此 Class
对象所表示的类或接口与指定的 Class
参数所表示的类或接口是否相同,或是否是其超类或超接口。如果是则返回true
;否则返回 false
。如果该 Class
表示一个基本类型,且指定的 Class
参数正是该 Class
对象,则该方法返回 true
;否则返回 false
。
它是通过父类名称点class,或者父类对象点getClass(),点isAssignableFrom(子类名称点class,或者子类对象点getClass()),进行比较。
A a = new A();
例如:boolean b = A.class.isAssignableFrom(B.class) 或者a.getClass().isAssignableFrom(b.getClass)
如果用equals或者==比较,那么比较的是他们的类类型是否相同。
例如:
class C {}
A.class.equals(C.class)或者A.class.getName() == C.class.getName()返回的肯定是false;
A.class它的值为:class 包路径.A 就是A的类路径
C.class它的值为:class 包路径.C 就是C的类路径
B类和A比较也是一样 如果不动态绑定,返回的也是false.
它们两比较你觉得可能返回true吗?
3.继承是“is a", 组合是“like a"
组合关系是:局部类和整体类的关系,包括从整体类到局部类的分解过程,从局部类到整体类的组合过程。
继承关系:父类和子类的关系,包括从子类到父类的抽象过程,从父类到子类的扩展过程。