您好,登录后才能下订单哦!
简介
instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。相当于c#中的is操作符。java中的instanceof是通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
我们现在就用一篇短文介绍一下instanceof的运算符的作用和注意事项。请看下面的代码片段
代码中定义了一个接口和两个类。大家记清楚它们之间的关系:Person类实现了Moveable接口,Student类继承了Person类。紧接着我们来看下面的代码
在代码中,我们创建了一些对象,并且使用instanceof运算符判断某个对象是否属于某种类型。请问程序的输出结果会是什么呢?公布一下答案:全部输出true!有读者可能不解为什么会是这样的输出结果?比如标号为⑥的那行代码,明明p2是Person类的对象,而Person类是Student的父类,为什么虚拟机会认为p2是Student类的对象呢?
为了弄清楚这个问题,我们必须搞清楚instanceof运算符的判断依据。instanceof运算符在判断的过程中,看的是引用实际指向的对象 (而不是看引用自身的类型)是不是可以被认定为属于某种类型。如果可以被认定为属于这种类型,那么运算结果为true;反之,如果假设不成立或未必成立,则运算结果为false。比如说,p2虽然是Person类型的,但它实际指向了一个Student类型的对象,所以p2肯定属于Student类型,因此输出结果为true。
其实我们可以用一种比较简单的方法来理解输出结果,那就是用一个自问句式来判断:一个a是一个A吗?比如说,p2实际指向的是一个Student类型的对象,而代码中出现了” p2 instanceof Person”(见标号为④的代码),我们就可以自问一下:一个Student(学生,既p2指向的那个对象)是一个Person(人)吗?一个学生当然是一个人,所以这句自问的答案肯定是true。反过来,如果代码被写成” p1 instanceof Student”, p1实际指向的是一个Person类的对象,我们再来分析一下运算结果,也可以采用这种自问的形式:一个Person(人)是一个Student(学生)吗?一个人未必是一个学生,所以这种假设并不一定成立,因此判断的结果为false。
我想,讲到这里,读者已经知道instanceof运算符的判断依据了吧?那么,在使用这个运算符的过程中,要注意哪些事项呢?归纳一下可以总结出两点:
1、instanceof左边必须是引用数据类型,而它右边一定是类或者接口的名称,不能是基础数据类型的名称。比如”1 instanceof int”或者” 1 instanceof Integer”这样的写法都是错误的。
2、如果instanceof左边的引用指向的是一个空对象(null),那么无论instanceof右边无论是什么类型,运算结果肯定是false。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。