instanceof 编译通过条件的误区

在JAVA中,instanceof关键字用来判断在其左边的对象是否为在其右边的类型的实例

在网络上查到有这样一条要求:左边的对象需要和右边的类型在同一颗继承树上,否则编译无法通过

Object类是所有类的父类,我觉得大家追根究底都在一棵树上,那岂不是任何时候都会得到true?

后来做了一些实验

需要再关注的是【声明类型】这个前提

        System.out.println(son_0 instanceof Son_1);//compile error
        System.out.println((Father)son_0 instanceof Son_1);//compile succeed, return false
        System.out.println((Object)son_0 instanceof Son_1);//compile succeed, return false
        System.out.println((FFather)son_0 instanceof Son_1);//compile succeed, return false
    

class Father extends FFather{}
class Son_0 extends Father{}
class Son_1 extends Father{}
class FFather{}

1、想要编译通过,需要声明类型符合条件,而无关运行类型

2、return结果按照运行类型得出

3、左侧不一定需要是右侧的实例或子类实例,才能通过编译,是右侧的父类也可以

由上推论:

编译通过的条件似乎是:左右的声明类型都处于一条继承链上(不可分枝)

以后有机会了要看看instanceof的底层实现,不过那大约在很遥远的将来吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值