JAVA中 instanceof 和 getClass() 区别小结

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

instanceof

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

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));
    }

上述代码输入以下:get

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。class

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

相关文章
相关标签/搜索