在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的底层实现,不过那大约在很遥远的将来吧