instanceof 原来我一直没理解对

判断一个对象是否是一个类的实例,用Java中自带的关键字instanceof似乎可

以做到(仅从关键字名称上可以猜测出),如下面的代码:

 public static void main(String args[]) {        Object i = new Integer(7);        if (i instanceof Number) {            System.out.println("Integer i is a Number");        } else {            System.out.println("Integer i isn't a Number");        }        if (i instanceof Serializable) {            System.out.println("Integer i is a Serializable");        } else {            System.out.println("Integer i isn't a Serializable");        }        if (i instanceof Integer) {            System.out.println("Integer i is an Integer");        } else {            System.out.println("Integer i isn't an Integer");        }        if (i instanceof Float) {            System.out.println("Integer i is a Float");        } else {            System.out.println("Integer i isn't a Float");        }    }

运行结果却出乎意料​​​​​​​

Integer i is a NumberInteger i is a SerializableInteger i is an IntegerInteger i isn't a FloatProcess finished with exit code 0

和预期的不太一样,能看出,使用该关键字不仅可以判断对象是否是某个类的实例,甚至连该类继承的基类和实现的接口也都能够被识别为true,虽然这样在逻辑上没有任何问题,是可以把Integer当做一个Number来看来用,也当做一个Serializable来看来用,但是这样返回的结果就没有针对性了,太过于模糊,我们如果仅仅需要i instanceof Integer为true该怎么做呢?


在Java有一个叫做Class的类,这是一个用来描述类信息的类,我们如果要精确判断一个对象是否是具体的一个类的实例,可以这么做:​​​​​​​

public static void main(String args[]) {    Object i = new Integer(7);    if (i.getClass().equals(Number.class)) {        System.out.println("Integer i is a Number");    } else {        System.out.println("Integer i isn't a Number");    }    if (i.getClass().equals(Serializable.class)) {        System.out.println("Integer i is a Serializable");    } else {        System.out.println("Integer i isn't a Serializable");    }    if (i.getClass().equals(Integer.class)) {        System.out.println("Integer i is an Integer");    } else {        System.out.println("Integer i isn't an Integer");    }    if (i.getClass().equals(Float.class)) {        System.out.println("Integer i is a Float");    } else {        System.out.println("Integer i isn't a Float");    }}

运行结果

Integer i isn’t a Number Integer i isn’t a Serializable Integer i is an Integer Integer i isn’t a Float

这样就能达到我们的目的了,从equals函数上就可以看出,上述代码是比较两个类的类信息是否一致,全相等,这其中不考虑继承实现的关系,当且仅当该对象是要比较的那个类的实例才返回true。


 

获取其他类型信息:

获取父类的类型信息:getSuperclass() 
获取实现的接口的类型信息:getInterfaces() 
获取类型名称:getName()、getSimpleName()、getCanonicalName()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值