面向对象之instanceof

instanceof是一个简单的操作运算符。它的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类,用于判断前面的对象是否是后面的类或其子类、实现类的实例。
根据Java语言的规范,使用instanceof运算符有一个限制:instanceof运算符前面操作数的编译时类型必须是如下3种情况:
    要么与后面的类相同
    要么是后面类的父类
    要么是后面类型的子类
如果前面操作数的编译时类型与后面的类型没有任何关系,程序将没法通过编译。当使用instanceof运算符的时候,应尽量从编译、运行两个阶段来考虑它:如果instanceof运算符使用不当,程序编译时就会抛出异常;当使用instanceof运算符通过编译后,才能考虑它的运算结果是true,还是false。
一旦instanceof运算符通过了编译,程序进入运行阶段。instanceof运算返回的结果与前一个操作数(引用变量)实际引用的对象的类型有关,如果它实际引用法的对象时第二个操作数的实例,或者是第二个操作数的子类、实现类的实例,instanceof结果返回true,否则返回false
在极端情况下,instanceof前一个操作数所引用对象的实际类型就是后面的类型,但只要它的编译时类型既不是第二个操作数的类型,也不是第二个操作数的父类、子类,程序就没法通过编译。
对于Java的强制转型而言,可以分为编译、运行两个阶段来分析它:
在编译阶段、强制转型要求被转型变量的编译时类型必须是如下3种情况之一:
被转型变量的编译时类型与目标类型相同。
被转型变量的编译时类型是目标类型的父类;
被转型变量的编译时类型是目标类型子类,这种情况下可以自动向上转型,无需强制转换。
如果被转型变量的编译时类型与目标类型没有任何继承关系,编译器将提示编译错误。通过上面分析可以看出,强制类型的编译阶段只关心引用变量     的编译时类型,至于该引用变量实际引用对象的类型,编译器并不关心,也没法关心。
在运行阶段,被转型变量所引用对象的实际类型必须是目标类型的实例,或者是目标类型的子类,实现类的实例,否则在运行时将引发异常。
instanceof运算符除了可以保证某个引用变量时特定类型的实例外,还可以保证该变量没有引用一个null.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值