JAVA中 instanceof 和 getClass() 区别小结

在进行对象之间的比较时会需要针对两个对象的类属性值进行比较,此时可以选择 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() 方法进行判断时,需要严格判断是否为相同类的对象。

转载于:https://my.oschina.net/u/1156626/blog/1621977

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值