首页 > 编程语言 >Java千问11:instanceof运算符用法详解

Java千问11:instanceof运算符用法详解

时间:2022-12-28 11:04:42浏览次数:71  
标签:11 p2 对象 运算符 Person Student instanceof

​Java语言当中提供了一个叫做instanceof的运算符。很多教科书上对这个运算符的介绍并不详细,只是简单的说这个运算符是用来判断某个对象是不是属于某种类型。我们现在就用一篇短文介绍一下instanceof的运算符的作用和注意事项。请看下面的代码片段

Java千问11:instanceof运算符用法详解_Java

代码中定义了一个接口和两个类。大家记清楚它们之间的关系:Person类实现了Moveable接口,Student类继承了Person类。紧接着我们来看下面的代码​

Java千问11:instanceof运算符用法详解_运算符_02

在代码中,我们创建了一些对象,并且使用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。​

如果想系统学习Java编程可以点击这里观看我在本站的视频课程。


标签:11,p2,对象,运算符,Person,Student,instanceof
From: https://blog.51cto.com/mugexuetang/5973884

相关文章

  • python实验报告(第11章)
    实验11:使用Python操作数据库一、实验目的和要求1、学会数据库编程接口;2、学会使用SQLite;3、学会使用MySQL。二、实验环境软件版本:Python3.1064_bit三、实验过程......
  • C++11:非受限联合体(union)
    在C/C++中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的C++为了和C语言保持兼容,对联合体......
  • 华大电子MCU-CIU32F011x3、CIU32F031x5低功耗介绍
    9.低功耗(LOWPOWER)9.1.低功耗模式在系统或电源复位以后,微控制器处于正常模式运行状态,系统所用时钟为256KHz内部RC振荡器输出。当CPU不需继续运行时,可以利用进......
  • 洛谷 P5363 / LOJ #3114 「SDOI2019」移动金币
    洛谷传送门LOJ传送门不错的博弈+计数。不难发现题中的游戏是阶梯Nim的变体。若设\(a_i\)为第\(i\)枚金币的位置,令\(\foralli\in[2,m],\b_i=a_i-a_{i-......
  • Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!
    ​我们知道,在Java以及很多高级编程语言当中,都有一种运算符叫做复合赋值运算符。复合赋值运算符由两个符号组成,它所能完成的运算操作也分为两步:第一步是运算,第二步是赋值。比......
  • CF363B 1100
    题意解析前缀和水题,就是在所有长度为k的区间里找个最小的。代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+10,M=......
  • CF368B 1100
    题意解析考察前缀知识。做的时候我好蠢,一直在想怎么前缀,大范围减小范围,怎么消除不同数字是否重复出现的影响。后来发现是自己蠢了,不就是求个后缀么。代码#include<bi......
  • CF313B 1100 *
    题意解析前缀和思想。f[i]用来代表到第i+1位有多少个满足s[k]==s[k+1]所以题目求从l~r,即求f[r-1]-f[l-1]代码#include<bits/stdc++.h>usingnamespacestd;ty......
  • AcWing. 1165.单词环
    传送门解题思路\(\qquad\)我们一开始可以得出一个建图的思路,对于每个字符串我们把它们当成图中的一个点,然后能“接龙”的字符串之间连一条边,在这张图上跑\(01\)分数规划......
  • 都2022年你还不会安装系统?看我三分钟完事PE制作并进行Win11系统安装实践
    本章目录:1.PE启用盘的下载制作2.Win11镜像的下载3.进PE安装Windows11(敲黑板)4.Win11初始化操作都2022年你还不会安装系统?看我三分钟完事PE制作并进行Win11系统安装实践前置......