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,一经查实,立即删除!

相关文章

中文导致Mybatis无效的列索引

<!-- 普铁 --><select id"selectTrainSceneThrough" parameterType"HashMap" resultType"HashMap">select ROUND(("普铁用户专网总流量KB""普铁用户公网总流量KB")/1024/1024,3) as total_dataflow,"普铁用…

python怎么创建配置文件_如何写python的配置文件

一、创建配置文件在D盘建立一个配置文件&#xff0c;名字为&#xff1a;test.ini内容如下&#xff1a;[baseconf]host127.0.0.1port3306userrootpasswordrootdb_namegloryroad[test]ip127.0.0.1int1float1.5boolTrue注意&#xff1a;要将文件保存为ansi编码&#xff0c;utf-8编…

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

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

Linux的 .bashrc 和.bash_profile和.profile文件

linux启动或是每次打开一个shell的时候都会执行用户家目录下的.bashrc文件&#xff0c;所有可以在这个文件里面添加一些内容&#xff0c;以便Linux每次启动时都会执行相应的内容。 如果ssh方式远程登录Linux时&#xff0c;会自动执行用户家目录下的.bash_profile文件&#xff0…

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

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

java oracle 排序_Oracle的排序和限制条件(order by 和where)

1、Order by子句的使用select column....from ....order by ...1) Order by子句在整个select语句中的位置&#xff1a;始终位于最后2) order by后可以跟什么&#xff1a;列名&#xff0c;列的别名&#xff0c;表达式&#xff0c;列出现在select关键字后的顺序(列号);3) order b…

kettle使用_ETL工具(kettle)-《PentahoKettle解决方案-使用PDI构建开源ETL解决方案》

&#xfeff;Matt Casters的博客:http://www.ibridge.be/、 www.kettle.be书籍:《Pentaho Kettle解决方案&#xff1a;使用PDI构建开源ETL解决方案》 链接&#xff1a;https://pan.baidu.com/s/15iUOWOCb8g_YLo5WN9fh0A 提取码&#xff1a;5upfkettle起源Kettle一词起源于“KDE…

Linux下chkconfig命令详解

原文&#xff1a;http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796873.html ------------------------------ chkconfig命令主要用来更新&#xff08;启动或停止&#xff09;和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务&#xff0…

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

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

java searchterm_elasticsearch – 弹性搜索:“Term”,“Match Phrase”和“Query String”之间的差异...

术语查询匹配单个术语&#xff0c;因为它是&#xff1a;不分析值。所以&#xff0c;它不必根据你索引的情况而降低。如果您在索引时间提供Bennett并且未分析该值&#xff0c;则以下查询将不返回任何内容&#xff1a;{"query": {"term" : { "user"…

python批量删除文件名_python批量删除文件名中的未知字符

python批量删除文件名中的未知字符如上图所示&#xff0c;需要修改的文件名的个数超过500个&#xff0c;如果一个一个的删除非常的费时间&#xff0c;现在用python修改很容易&#xff0c;方便又省时间&#xff0c;具体步骤如下1)首先根据自己需要修改的文件名编写rename.py程序…

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

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

In Compiler.php line 36: Please provide a valid cache path.

/********************************************************************************** In Compiler.php line 36: Please provide a valid cache path.* 说明&#xff1a;* 安装OpenSourceBikeShare过程中遇到的报错&#xff0c;由于目前对这个东西不熟悉&#x…

现代控制会用到python嘛_Python 流程控制

Python流程控制1.顺序结构我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。2.分支结构(if、elif、else语句)然而仅有顺序结构并不能解决所有的问题&#xff0c;比如我们设计一个游戏&#xff0c;游戏第一关的通关条件是玩家获得1000分…

java tar 安装程序_linux下jdk的安装(tar包)

1、查看jdk安装路径[rootlocalhost ~]# whereis javajava: /usr/bin/java /etc/java /usr/lib/java /usr/share/java /usr/share/man/man1/java.1.gz[rootlocalhost ~]# which java/usr/bin/java注&#xff1a;whereis:该指令会在特定目录中查找符合条件的文件。这些文件应属于…

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

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

中断和中断处理程序

1. 中断 Linux内核要对连接到计算机上的所有硬件设备进行管理&#xff0c;首先要能和它们互相通信。从所周知&#xff0c;处理器的速度跟外围硬件设备的速度往往不在一个数量级上。所以&#xff0c;需要一种机制&#xff0c;如果轮询(polling)是一种解决办法&#xff0c;可以让…

Hadoop解决内存受限问题

因为NameNode的数据需要加载到内存里&#xff0c;随着数据越来越大&#xff0c;内存会不够用出现内存受限问题。 解决方法&#xff1a; 官网&#xff1a;hdfs联邦 http://blog.csdn.net/zengmingen/article/details/52143300 国内&#xff1a; 因为数据存在阶段性&#x…

python最简分数_1062 最简分数 Python实现

1062 最简分数 (20 分)一个分数一般写成两个整数相除的形式&#xff1a;N/M&#xff0c;其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。现给定两个不相等的正分数 N​1​​/M​1​​ 和 N​2​​/M​2​​&#xff0c;要求你按从小到大的顺序列出它们之间分母…

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

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