java instanceof 继承_Java中的instanceof关键字

Java中,instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如

果是返回true,否则返回false。

也就是说:

使用instanceof关键字做判断时, instanceof 操作符的左右操作数必须有继承或实现关系

下面我们用继承树来判断instanceof的返回值:

1 packageinstanceofTest;2

3 /**

4 *@authorzsh5 * @company wlgzs6 * @create 2019-03-21 19:557 * @Describe 继承树来判断instanceof的返回值8 */

9 interfaceMan{}10 class Person1 implementsMan{}11 class Student extendsPerson1{}12 class Postgraduate extendsStudent {}13 classAnimal {}14 public classMain1 {15 public static voidmain(String[] args) {16 System.out.println("Student 的对象是谁的实例?");17 instanceofTest(newStudent());18 System.out.println("Animal 的对象是谁的实例?");19 instanceofTest(newAnimal());20 System.out.println("Postgraduate 的对象是谁的实例?");21 instanceofTest(newPostgraduate());22 //一个类的实例是这个类本身的实例,也是他父类,父类的父类的实例,也是实现的接口的实例

23 }24

25 public static voidinstanceofTest(Object p) {26 if (p instanceofAnimal)27 System.out.println(p.getClass() + "类的实例 是类Animal的实例");28 if (p instanceofPostgraduate)29 System.out.println(p.getClass() + "类的实例 是类Postgraduate的实例");30 if (p instanceofStudent)31 System.out.println(p.getClass() + "类的实例 是类Student的实例");32 if (p instanceofPerson1)33 System.out.println(p.getClass() + "类的实例 是类Person的实例");34 if (p instanceofMan)35 System.out.println(p.getClass() + "类的实例 是接口Man的实例");36 if (p instanceofObject)37 System.out.println(p.getClass() + "类的实例 是类Object的实例");38 }39 }

上面的程序,展示各类之间的关系的继承树是:

e7c3739b67243b5825562fb6465de59f.png

上述程序中:

由上面继承树可知,某个类(接口也可以看成一个特殊的类)的对象是不是其他类(或接口)的实例,只需按箭头方向,以此对象所在的类为起点到达此继承树分支(可能有多个分支)终点,沿途经过的类(包括本类,或接口)就都是该对象的实例。

所以输出结果是:

c756e367c8cd0671371b21331d9b1523.png

但是,要注意一点:

在判断某个类(接口也可以看成一个特殊的类)的对象是不是其他类(或接口)的实例,一定要首先进行向上转型,然后才可用instanceof关键字进行判断,这是基本操作规范。

如:

1 packageinstanceofTest;2

3 /**

4 *@authorzsh5 * @company wlgzs6 * @create 2019-03-21 20:027 * @Describe8 */

9

10 interfaceA{11 voidsay();12 }13

14 class B implementsA{15 public voidsay()16 {17 System.out.println("B实现的say()方法");18 }19 }20

21 class C implementsA{22 public voidsay()23 {24 System.out.println("C实现的say()方法");25 }26 }27

28 public classMain2 {29 public static voidmain(String[] args) {30 A a= new B(); //接口不能new

31 System.out.println(a instanceof B); //true;发生了A a= new B();

32 System.out.println(a instanceof C); //false;没有发生A a = new C();

33 }34 }

运行结果:

b34eb157cda416b0b3161da1ac668246.png

以上各类的之间关系的继承树如下:

05c9671a7a1afef5ee138f8f5fa59b16.png

在判断接口A的对象a 是不是类C的实例时,没有先进行向上转型,就进行instanceof关键字的使用了,是肯定会返回false的。

测试用例:

1 packageinstanceofTest;2

3 /**

4 *@authorzsh5 * @company wlgzs6 * @create 2019-03-21 20:077 * @Describe instanceof 测试用例8 */

9 interfaceA{10

11 }12 class B implementsA{13

14 }15 class C extendsB{16

17 }18 public classMain3 {19 public static voidmain(String[] args) {20 A ab=newB();21 A ac=newC();22 B bc=newC();23 B bb=newB();24 C cc=newC();25 //对象实现一个接口,用这个对象和这个接口进行instanceof判断,都为true。

26 System.out.println("ab instanceof A="+(ab instanceofA));27 System.out.println("ac instanceof A="+(ac instanceofA));28 System.out.println("bc instanceof A="+(bc instanceofA));29 System.out.println("bb instanceof A="+(bb instanceofA));30 System.out.println("cc instanceof A="+(cc instanceofA));31 //对象和父类进行instanceof判断,都为true

32 System.out.println("ab instanceof B="+(ab instanceofB));33 System.out.println("ac instanceof B="+(ac instanceofB));34 System.out.println("bc instanceof B="+(bc instanceofB));35 System.out.println("bb instanceof B="+(bb instanceofB));36 System.out.println("cc instanceof B="+(cc instanceofB));37 //对象和他的子类进行instanceof判断为false

38 System.out.println("ab instanceof C="+(ab instanceofC));39 System.out.println("ac instanceof C="+(ac instanceofC));40 System.out.println("bc instanceof C="+(bc instanceofC));41 System.out.println("bb instanceof C="+(bb instanceofC));42 System.out.println("cc instanceof C="+(cc instanceofC));43 }44 }

运行结果:

088a1b257dbea4c4b1607a6e575ecee5.png

总结:

如果一个类的实例是这个类本身的实例,那么它也是它的父类、它的父类的父类的实例,也是由它实现的接口的实例

且instanceof左边操作元显式声明的类型与右边操作元必须是同种类或右边是左边父类的继承关系

此外:

//false;这是instanceof 特 有 的 规 则 : 若左操作数为null, 结果就直接返回false, 不再运算右操作数是什么类。

boolean b5 = null instanceof String;

//编译不通过;'A'在此处视为基本数据类型char,instanceof操作符只能用作对象的判断

boolean b4 = 'A' instanceof Character;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记-JMeter 进行接口压力测试

一、压力测试场景设置 1、场景设定:进行接口压力测试时,有单场景也有混合场景。单场景就是对一个接口进行请求;混合场景需要对多个接口进行请求,在流程类业务场景会运用到 2、压测时间设定:通常时间为10-15…

四宫格效果 css_【深度教研】智力游戏“九宫格” 集体教研活动纪实

【关键词】教研要建立过程模式,规范管理,分层推进,各负其责,及时反馈,展示总结。让教研的过程成为全体教师共同成长的过程。游戏和材料不是一次性的制作和一次性的使用,其价值在于反复玩,玩中学…

sql server numeric 可存几位小数_CBA中的10大传奇队长,将篮球精神一直传递下去,你认识几位呢?...

阅读本文前,请您先点击上面的蓝色字体“十点听情感”,再点击“关注”,这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅,请放心关注!!!中国男子篮球职业联赛简称CBA中国篮球自…

设置ntpdate服务开机启动校验时间

一般linux都预装了 ntpdate 服务。 如果没有安装,参考博文:http://blog.csdn.net/zengmingen/article/details/52913486启动设置 1、检查系统服务里有没有ntpdate 使用命令:chkconfig --list2、设置开机启动 chkconfig 的命令详见&#xff1a…

电脑卡顿不流畅是什么原因_什么造成游戏直播画画卡顿、延迟?这三个原因了解一下...

原标题:什么造成游戏直播画画卡顿、延迟?这三个原因了解一下从事直播的朋友们相信都有所体会,直播时很容易出现画面卡顿、延迟的现象,这究竟是什么原因造成的呢?最可能是这几点!1、服务器过载崩溃说起服务器…

java linux 调用32位so_从linux源码看socket(tcp)的timeout

从linux源码看socket(tcp)的timeout前言网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp)中的各种超时设置,于是就有了本篇博文。本文大部分讨论的是socket设置为block的情况…

spark DAGScheduler、TaskSchedule、Executor执行task源码分析

摘要 spark的调度一直是我想搞清楚的东西,以及有向无环图的生成过程、task的调度、rdd的延迟执行是怎么发生的和如何完成的,还要就是RDD的compute都是在executor的哪个阶段调用和执行我们定义的函数的。这些都非常的基础和困难。花一段时间终于弄白了其中…

代码实现tan graph model for classification_自定义 Estimator 实现(以BERT为例)

本文将主要介绍tensorflow 的Estimator 这个高级API,它的主要作用就是提出一个高级范式(paradigm),将模型的训练,验证,预测,以及保存规范起来,免去了tensorflow的Session.run 的操作…

英雄联盟怎么解除小窗口_英雄联盟手游怎么加好友_英雄联盟手游怎么加好友一起玩_资讯...

英雄联盟手游是腾讯联合英雄联盟开发商拳头开发的英雄联盟手游。不仅能够高度还原端游的经典操作和竞技体验,也具有非常多创新的元素,对于英雄联盟的全球生态布局具有重要意义。英雄联盟手游游戏中有非常多的英雄可以供玩家选择,并且拥有排位…

Sonar与jenkins集成

2019独角兽企业重金招聘Python工程师标准>>> 参考文档:http://blog.csdn.net/kefengwang/article/details/54377055 一.下载:wget https://fossies.org/linux/misc/sonarqube-7.0.zip 二.配置sonar.properties ## sudo vim /opt/sonarqube-6.…

eplan连接定义点不显示_EPLAN电气图实例--控制柜(控制面板)

EPLAN电气图实例--控制柜(控制面板)上期回顾(上期主要画了硬件的布局图):这期主要画一个控制面板控制柜布局1.0 上期主要做了一个长方形的结构板,里面插入了一个结构盒,然后放置一个HMI的宏(这里是KTP1000,在官网随便找下就行了)&…

markdown 语法_markdown特殊语法之上下标

markdown特殊语法之上下标​markdown的基本语法很简单,百度一下就可以了,有空的话我再转载一些过来。我想的是平常其实需要用到的一些输入技巧,特殊用法或者扩展语法,还有一些难点倒是要记录学习一下。在写作的时候,大…

oracle安装向导卡住了_JDK 8 的安装与配置

一、安装环节1. 打开网页https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html2.找到对象的版本 尽量从官网下载(官网可能会比较慢,也可以通过浏览器输入jdk版本号进行下载)官网下载需要注册一个账号3.双击下载的 exe,如 jdk-8u131-windows…

web 前端 如何分享到instagram_如何找到靠谱的Web培训机构?web前端培训机构哪个好?...

现如今Web前端开发应用越来越广泛,Web前端工程师人才需求逐年递增,薪资待遇也是水涨船高,也因此吸引了越来越多的人想要迈入Web前端行业,参加Web前端培训是很多人选择学习前端开发技能的途径,那么Web前端培训机构哪个好…

Spring Data JPA 实例查询

转自:https://www.cnblogs.com/rulian/p/6533109.html 一、相关接口方法 在继承JpaRepository接口后,自动拥有了按“实例”进行查询的诸多方法。这些方法主要在两个接口中定义,一是QueryByExampleExecutor,一个是JpaRepository&am…

windows找不到文件gpedit.msc_此电脑右键管理提示windows找不到文件的解决方法

也许当你右键点击此电脑管理时,也许会出现Windows找不到文件的提示,下面提供一些解决方法:1、首先按下“Windows”R组合键打开运行,在弹出的“运行“对话框中输入”compmgmt.msc“,点击”确定“;2、如果此时…

java序列化流_java 序列化流与反序列化流

一 对象序列化流ObjectOutputStreamObjectOutputStream 将Java对象的基本数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。注意:只能将支持 java.io.Serializable 接口的对象写入流中用于从流…

win10文件显示后缀名_win10系统,如何去除“此电脑” 里的6个多余文件夹

Windows系统从XP到win7,再到进化到如今的win10,在系统性能和使用便捷性方面,确实改进了很多,但是,金无赤足,没有完美的东西,总是有一些小细节让我们感觉不舒服,如如鲠在喉。比如我们下面看到的这…

数字化工厂的五大系统_如何搭建以MES系统为核心的数字化工厂?

MES强调车间级的过程集成、控制和监控,以及合理地配置和组织所有资源。满足车间信息化需要,提高车间对随机事件的快速响应和处理能力,有力地促进企业信息化进程向车间层拓展。通过构建以“精益生产、智能制造”为特点的车间管理系统&#xff…

zookeeper数据结构及Znode类型

结构 1、层次化的目录结构,命名符合常规文件系统规范 2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识。 3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)。 4、客户端应用可以在节点上设置监视器…