JAVA中 instanceof 和 getClass() 区别小结

2018-02-27 11:49:47来源:oschina作者:前世疯狂人点击

分享

在进行对象之间的比较时会需要针对两个对象的类属性值进行比较,此时可以选择 instanceof 或者 getClass()进行比较判断。两者都可以用于比较对象之间的类是否相同,但也存在一些区别。


instanceof

使用 instanceof 时会判断该对象是否属于指定类或接口,同时也会判断是否属于其继承类或实现类。如果满足其中一个条件则返回值为 true,否则为 false。测试代码如下:


public class Test {
public static void main(String[] args) {
Object a = new SubClassA();
System.out.println("a instanceof SubClassA is: " + (a instanceof SubClassA));
System.out.println("a instanceof SuperClass is: " + (a instanceof SuperClass));
System.out.println("a instanceof SuperInterface is: " + (a instanceof SuperInterface));
System.out.println("a instanceof SubClassB is: " + (a instanceof SubClassB));
}
}
class SuperClass {
}
interface SuperInterface {
}
class SubClassA extends SuperClass implements SuperInterface {
}
class SubClassB extends SuperClass {
}

上述代码输入如下:


a instanceof SubClassA is: true
a instanceof SuperClass is: true
a instanceof SuperInterface is: true
a instanceof SubClassB is: false

由于 a 对象为 SubClassA 类的实例,且继承了 SuperClass 类,并实现了 SuperInterface 接口,故使用 instanceof 进行判断的时候结果都为 true,而与 SubClassB 类进行比较时则为 false。


getClass()

使用 getClass() 方法进行判断时,由于 getClass() 方法返回值为当前实例对象的 Class 对象,同时 Class 类并未重写 equals() 方法,故进行判断时不论是使用 == 还是使用 equals() 方法都是一样的效果(Object类的 equals() 方法也是使用的 == 进行比较),是比较当前的 Class 对象是否相同。测试代码如下:


public static void main(String[] args) {
Object a = new SubClassA();
System.out.println("a.getClass() == SubClassA.class is: " + (a.getClass() == SubClassA.class));
System.out.println("a.getClass() == SuperClass.class is: " + (a.getClass() == SuperClass.class));
System.out.println("a.getClass() == SuperInterface.class is: " + (a.getClass() == SuperInterface.class));
System.out.println("a.getClass() == SubClassB.class is: " + (a.getClass() == SubClassB.class));
}

上述代码输入如下:


a.getClass() == SubClassA.class is: true
a.getClass() == SuperClass.class is: false
a.getClass() == SuperInterface.class is: false
a.getClass() == SubClassB.class is: false

由于 a 对象为 SubClassA 类的实例,通过 getClass() 方法进行判断时不会对其父类或其接口类进行关联,故对应判断结果都为 false。


通过上述比较可知,使用 instanceof 进行类的判断时,只要左边的对象是右边的类的子类或实现类时均可成立。而使用 getClass() 方法进行判断时,需要严格判断是否为相同类的对象。

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台