严格来说 instanceof 是 Java 中的一个双目运算符,由于它是由字母组成的,所以也是 Java 的保留关键字。在 Java 中可以使用 instanceof 关键字判断一个对象是否为一个类(或接口、抽象类、父类)的实例,语法格式如下所示。

boolean result = obj instanceof Class

其中,obj 是一个对象,Class 表示一个类或接口。obj 是 class 类(或接口)的实例或者子类实例时,结果 result 返回 true,否则返回 false。

Java instanceof 关键字的几种用法。

1 . 声明一个 class 类的对象,判断 obj 是否为 class 类的实例对象(普遍的一种用法),如以下代码:

Integer integer = new Integer(1);
System.out.println(integer instanceof  Integer);    // true

2 . 声明一个 class 接口实现类的对象 obj,判断 obj 是否为 class 接口实现类的实例对象,如以下代码:
Java 集合中的 List 接口有个典型实现类 ArrayList。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

所以我们可以用 instanceof 运算符判断 ArrayList 类的对象是否属于 List 接口的实例,如果是返回 true,否则返回 false。

ArrayList arrayList = new ArrayList();
System.out.println(arrayList instanceof List);    // true

或者反过来也是返回 true

List list = new ArrayList();
System.out.println(list instanceof ArrayList);    // true

3 . obj 是 class 类的直接或间接子类
我们新建一个父类 Person.class,代码如下:

public class Person {}

创建 Person 的子类 Man,代码如下:

public class Man extends Person {}

测试代码如下:

Person p1 = new Person();
Person p2 = new Man();
Man m1 = new Man();
System.out.println(p1 instanceof Man);    // false
System.out.println(p2 instanceof Man);    // true
System.out.println(m1 instanceof Man);    // true

第 4 行代码中,Man 是 Person 的子类,Person 不是 Man 的子类,所以返回结果为 false。

值得注意的是 obj 必须为引用类型,不能是基本类型。例如以下代码:

int i = 0;
System.out.println(i instanceof Integer);    // 编译不通过
System.out.println(i instanceof Object);    // 编译不通过

所以,instanceof 运算符只能用作对象的判断。

当 obj 为 null 时,直接返回 false,因为 null 没有引用任何对象。

Integer i = 1;
System.out.println(i instanceof null);    // false

所以,obj 的类型必须是引用类型或空类型,否则会编译错误。

当 class 为 null 时,会发生编译错误,错误信息如下:

Syntax error on token "null", invalid ReferenceType

所以 class 只能是类或者接口。

编译器会检查 obj 能否转换成右边的 class 类型,如果不能转换则直接报错,如果不能确定类型,则通过编译。示例。

Person p1 = new Person();
System.out.println(p1 instanceof String);    // 编译报错
System.out.println(p1 instanceof List);    // false
System.out.println(p1 instanceof List<?>);    // false
System.out.println(p1 instanceof List<Person>);    // 编译报错

上述代码中,Person 的对象 p1 很明显不能转换为 String 对象,那么p1 instanceof String不能通过编译,但p1 instanceof List却能通过编译,而instanceof List又不能通过编译了。

上述可以理解成以下代码:

boolean result;
if (obj == null) {result = false;    // 当obj为null时,直接返回false
} else {try {// 判断obj是否可以强制转换为TT temp = (T) obj; result = true;} catch (ClassCastException e) {result = false;}
}

在 T 不为 null 和 obj 不为 null 时,如果 obj 可以转换为 T 而不引发异常(ClassCastException),则该表达式值为 true ,否则值为 false 。所以对于上面提出的问题就很好理解了,p1 instanceof String会编译报错,是因为(String)p1是不能通过编译的,而(List)p1可以通过编译。

instanceof 也经常和三目(条件)运算符一起使用,代码如下:

A instanceof B ? A : C

判断 A 是否可以转换为 B ,如果可以转换返回 A ,不可以转换则返回 C。下面通过一个例子来讲解,代码如下:

public class Test {public Object animalCall(Animal a) {String tip = "这个动物不是牛!";// 判断参数a是不是Cow的对象return a instanceof Cow ? (Cow) a : tip;}public static void main(String[] args) {Sheep sh = new Sheep();Test test = new Test();System.out.println(test.animalCall(sh));}
}class Animal {}class Cow extends Animal {}class Sheep extends Animal {}

以上代码中,我们声明了一个 Animal 类作为父类,Cow 类和 Sheep 类为 Animal 的子类,在 Test 类的 main 函数中创建类 Sheep 的对象作为形参传递到 animalCall 方法中,因为 Sheep 类的对象不能转换为 Cow 类型,所以输出结果为“这个动物不是牛!”。

Java instanceof关键字详解相关推荐

  1. Java instanceof用法详解

    instanceof 是 Java 的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型. instanceof instanceof是Java中的二元运算 ...

  2. Java this关键字详解

    this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用. this.属性名 大部分时候,普通方法访问其他方法.成 ...

  3. Java——volatile关键字详解

    关注微信公众号:CodingTechWork,一起学习进步. volatile介绍 volatile概述 volatile是比synchronized关键字更轻量级的同步机制,访问volatile变量 ...

  4. Java volatile关键字详解

    1.关于volatile volatile是Java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能.它主要有两重语义,一是保证多 ...

  5. Java protected 关键字详解

    很多介绍Java语言的书籍(包括<Java编程思想>)都对protected介绍的比较的简单,基本都是一句话,就是: 被 protected 修饰的成员对于本包和其子类可见.这种说法有点太 ...

  6. [转载] Java static关键字详解

    参考链接: Java中的static关键字 static关键字 在类中,用static声明的成员变量为静态成员变量,也成为类变量.类变量的生命周期和类相同,在整个应用程序执行期间都有效. 这里要强调一 ...

  7. Java super关键字详解

    一.super关键字作用 1:主要存在于子类方法中,用于指向子类对象中父类对象. 2:访问父类的属性 3:访问父类的函数 4:访问父类的构造函数 二. super注意的地方 this和super很像, ...

  8. Java关键字详解-配视频讲解链接(附带一些面试题)

    Java中常用的关键字详解-配视频讲解链接(附带一些面试题) 关键字:被Java赋予了特定含义的英文单词.关于关键字的学习贯穿了整个Java的学习,结合应用理解记忆关键字,不能单纯的死记硬背,在这里通 ...

  9. Day16-01 P71 面向对象12什么是多态 P72 对象13:instanceof和类型转换 P73 static关键字详解 P74 抽象类 P75 接口的定义与实现 P76N种内部类

    Day16-01 P71 面向对象12:什么是多态 //父类Person package com.oop.demo06;public class Person {public void run(){S ...

最新文章

  1. 树莓派小车参考方案,了解一下
  2. java ftp上传文件 linux_Java实现把文件上传至ftp服务器
  3. linux web 服务器性能,Linux系统Web服务器性能测试(2)
  4. JS的常用正则表达式 验证密码
  5. Blog.Core高级进阶:共赴五年之约
  6. 2.9 while循环
  7. 【Python实例第1讲】交叉验证预测曲线的画法
  8. 淘宝双十一火爆下的暗礁?
  9. tp3.2 volist标签
  10. 联想官方一键关闭Win10Defender、关闭Win10自动更新工具
  11. NJUPT【电工电子基础实验】
  12. 对联广告php代码,css实现的对联广告代码
  13. 2020-01-04
  14. 最新百度地图—POI搜索功能讲解
  15. 计算机没有网络时间不准如何设置,轻松解决电脑时间不准的方法
  16. 查询人数最多的部门名字
  17. interrupt()方法理解和实例
  18. 单片机IO口悬空,高阻态究竟是什么意思?
  19. HT合泰单片机入门教程(第七章 LCD)
  20. Zabbix基于Dell系统管理OMSA监控物理服务器硬件

热门文章

  1. 收文处理和发文处理的环节_集气罩的设计是气体净化、废气处理系统设计的重要环节...
  2. mysql永远不用utf8_永远不要在 MySQL 中使用「utf8」
  3. mysql 测试数据的脚本_Mysql脚本 生成测试数据
  4. Win11如何查看电池情况 Win11查看电池情况的方法
  5. 生命大发的意义 BY 几米
  6. 百度地图API实现地图应用
  7. null、undefined、NaN区分解析和条件判定,以及在IF条件中的判定
  8. Java 中访问路径的问题
  9. python2转python3代码_Python2代码转成Python3代码
  10. numpy 矩阵与向量相乘_高能!8段代码演示Numpy数据运算的神操作