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关键字解析