严格来说 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又不能通过编译了。关于这些问题,可以查看Java语言规范Java SE8版寻找答案,如图所示。

可以理解成以下代码:

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 类型,所以输出结果为“这个动物不是牛!”。

1.10 instanceof关键字相关推荐

  1. Java之Object类与instanceof关键字

    Object类是所有类的父类: 我们上下代码: 1 package com.learn.chap03.sec14; 2 3 public class A { // 上面类A继承了Object类,因此又 ...

  2. java instanceof 继承_Java中的instanceof关键字

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

  3. java中多态,instanceof关键字

    多态: 面向对象三大特征:继承.封装.多态,其中多态指的是有多种形态,可以使代码更加灵活,而非状态.继承或接口是多态的前提,比如一个对象狗是宠物类的实现类对象,而宠物类又继承了动物类,狗同时具有多种形 ...

  4. Java基础系列--instanceof关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8492158.html instanceof关键字是在Java类中实现equals方法最常使 ...

  5. java instance关键字_Java中instanceof关键字和isInstance()方法的区别是什么

    instanceof关键字和isInstance()方法都用于检查对象的类,那么它们之间有什么区别?下面本篇文章就来带大家了解一下instanceof关键字和isInstance()方法之间的区别,希 ...

  6. java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...

    java学习中,instanceof 关键字 和 final 关键字.值的传递(java 学习中的小记录)作者:王可利(Star·星星) instanceof 关键字 作用: 1.用来判断某个对象是否 ...

  7. java基础9 main函数、this、static、super、final、instanceof 关键字

    一.main函数详解 1.public:公共的.权限是最大的,在任何情况都可以访问   原因:为了保证jvm在任何情况下都可以访问到main法 2.static:静态,静态可以让jvm调用更方便,不需 ...

  8. Java中的instanceof关键字

    Java中的instanceof关键字 instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边 ...

  9. java多态性补充-instanceof关键字

    //不能调用子类所特有的方法.属性 ,编译时,P2是person类型// p2.earnMoney();//有了对象的多态性以后,内存中实际上加载了子类特有的属性和方法,但由于变量声明为父类类型,导致 ...

最新文章

  1. spark 朴素贝叶斯
  2. 【干货】这10个Liunx命令能提高50%的工作效率
  3. 【AI初识境】给深度学习新手开始项目时的10条建议
  4. 传统企业如何实现移动化转型?
  5. 飞机订票系统的html模板,飞机订票系统程序设计
  6. php自动验证,ThinkPHP 自动验证及验证规则详解
  7. c++ 原子操作 赋值_Volatile深度剖析-原子性
  8. 征途linux mysql_Linux环境——MySQL安装及配置(5.7版本)
  9. 安装网卡驱动失败(已解决)
  10. breakall lisp文件_CAD导入草图大师后自动成面
  11. Pr:视频效果( 2020 版)速览
  12. 海量Oracle学习视频分享
  13. 解决HD3000在OS X 10.10.2上横线和花屏问题
  14. 1055 集体照 (25 分)
  15. 阿里巴巴国际站业务如何写出高效便捷的客户开发跟进邮件?
  16. 这些年,阿里巴巴技术大牛们曾经写过哪些书籍!
  17. GC overhead limit exceeded
  18. 怎么把word里面的彩色图转化为灰度图,直接在word里面操作,无需转其他软件,超简单!(位图和矢量图都可以)
  19. pyqt5中利用搜索框和按钮,搜索表中内容
  20. 操盘手的灵魂 - 交易纪律

热门文章

  1. Py之wxPython:wxPython的简介、安装、使用方法之详细攻略
  2. MyBatis 与 Hibernate
  3. app微信支付的集成步骤
  4. ecshop php5.4以上版本错误之preg_replace 替换成 preg_replace_callback
  5. 快速了解上市公司年报
  6. Swift游戏实战-跑酷熊猫 00 游戏预览
  7. uboot重定位代码分析(转)
  8. MiniGUI.cfg 文件详解
  9. 计算机网络第六章ppt课件,计算机网络与通信(第6章).ppt
  10. oracle dba_seg,Oracle DBA 应知应会 -- PGA自动管理