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 }

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

上述程序中:

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

所以输出结果是:

但是,要注意一点:

在判断某个类(接口也可以看成一个特殊的类)的对象是不是其他类(或接口)的实例,一定要首先进行向上转型,然后才可用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 }

运行结果:

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

在判断接口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 }

运行结果:

总结:

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

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

此外:

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

boolean b5 = null instanceof String;

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

boolean b4 = 'A' instanceof Character;

java instanceof 继承_Java中的instanceof关键字相关推荐

  1. java instanceof翻译_Java 中的instanceof简单讲解

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...

  2. java instanceof运算符_Java 中的instanceof 运算符

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...

  3. java的继承_java中的继承(一)

    在java中,所有的类都有一个默认的父类Object,即使我们没有显式的去继承这个类.在Object类中定义了一些方法,其中有几个方法是我们必须掌握的,比如equals方法,hashCode方法,wa ...

  4. java 值 继承_java中继承的数值传递引用

    展开全部 这个题目如下思路与实现 思路:依照圆和圆柱的描述抽象成Java程序里的对象Cylinder与Circle,这也32313133353236313431303231363533e4b893e5 ...

  5. java中instanceof 详解_java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

  6. java instanceof用法_java中instanceof用法

    转自https://www.cnblogs.com/bkyshichao/p/7090401.html Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.inst ...

  7. java instanceof 区别_Java 中 instanceof 和 isInstance 的区别

    今天百度了一下 instanceof 和 isInstance() 的区别,结果不理想.大多数人先贴一段测试代码,然后分别解释它们的用法,根本不是解释它们之间的区别. 本来想快点搜一下看个结论,不料还 ...

  8. java 中特殊的_Java中一些特殊关键字

    transient 被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null. ins ...

  9. 什么是java的关键字_java中常见的关键字

    什么是关键字呢? 概述:关键字就是在java语言中赋予特殊含义的单词 特点:1.组成的关键字的单词全是小写 2.常见的代码编辑器中,对关键字都有特殊的颜色标记 比如在idea中对关键字都有特殊的颜色标 ...

最新文章

  1. Git探秘:实用主义(1/2)
  2. MYSQL创建多张表,相同表结构,不同表名
  3. 关于Linux的前世今生(一)
  4. 前端学习(1746):前端调试值之时间监听
  5. RTT学习笔记3-时钟定时器管理
  6. 管理Kubernetes集群时需要关注的关键指标
  7. 神经网络的Dropout的理解
  8. 对 数组[i].index=i的理解
  9. 推荐几款git管理工具
  10. 平均股价的时间序列图形_统计学-时间序列分析ppt
  11. 转载---英语 是否 双写 规则
  12. Scrum板与Kanban如何抉择?敏捷工具:SHSYdsjgyadtgad
  13. linux使用iptables屏蔽ip段,利用iptables屏蔽IP段
  14. 2015美团算法工程师笔试、面试之旅
  15. 记一次尴尬的经历---硅胶干燥剂颗粒堵住了耳机孔
  16. 计算机大学生三好学生申请书,大学生三好学生申请书
  17. uni-app中设置不同平台显示不同的样式
  18. 腾讯云DNS 域名服务器(nameservers)修改
  19. 普元元数据产品如何安装到普元应用服务器AppServer上
  20. 收藏一些很炫的html特效

热门文章

  1. 《软件项目管理(第二版)》第 3 章——项目计划 重点部分总结
  2. 平衡二叉树AVL删除
  3. spark将rdd转为string_八、Spark之详解Tranformation算子
  4. html5折叠卡片,基于HTML5折叠卡片式下拉菜单代码
  5. 日常问题——hadoop 任务运行到running job就卡住了 INFO mapreduce.Job: Running job: job_1595222530661_0003
  6. 区间DP初探 P1880 [NOI1995]石子合并
  7. 那些你不知道的 getClientRects()
  8. Oracle 10g 高级安装图文教程(二)
  9. php-对银行卡号做掩码处理
  10. Feature selection