instanceof 严格来说是Java中的⼀个双⽬运算符,⽤来测试⼀个对象是否为⼀个类的实例,⽤法为:

boolean result = obj instanceof Class

  其中 obj 为⼀个对象,Class 表示⼀个类或者⼀个接⼝,当 obj 为 Class 的对象,或者是其直接或间接⼦类,或者是其接⼝的实现类,结果result 都返回 true,否则返回false。
  注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运⾏时定。

1、obj 必须为引⽤类型,不能是基本类型

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

2、obj 为 null

System.out.println(null instanceof Object);//false 

3、obj 为 class 类的实例对象

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

4、obj 为 class 接⼝的实现类

可以⽤ instanceof 运算符判断 某个对象是否是 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

5、obj 为 class 类的直接或间接⼦类

新建⼀个⽗类 Person.class,然后在创建它的⼀个⼦类 Man.class

public class Person {
}
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

 注意第⼀种情况, p1 instanceof Man ,Man 是 Person 的⼦类,Person 不是 Man 的⼦类,所以返回结果为 false。

6、问题

  编译器会检查 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>);//编译报错

instanceof⽤伪代码描述:

boolean result;
if (obj == null) {
 result = false;
} else {
 try {
 T temp = (T) obj; // checkcast
 result = true;
 } catch (ClassCastException e) {
 result = false;
 }
}
简单来说就是:如果 obj 不为 null 并且 (T) obj 不抛 ClassCastException 异常则该表达式值为 true,否则值为 false 。

  所以对于上⾯提出的问题就很好理解了,为什么 p1 instanceof String 编译报错,因为(String)p1 是不能通过编译的,⽽ (List)p1 可以通过编译。

下载: Java关键字解析

最后修改日期: 2022年2月22日