instanceof关键字

183 阅读1分钟

www.cnblogs.com/ysocean/p/8…

instanceof是什么

instanceof严格说是Java中的双目运算符,用法是:

boolean b = obj instanceof Class;

obj表示一个对象,Class表示一个类或者接口。当obj时Class的一个实例或者子类实例、实现类实例时,返回true。 编译器会检查obj能否被转为Class,不能的话编译直接报错。如果无法判断,则会在运行阶段判断。

一些细节

obj只能是引用类型

obj如果是基本类型,编译报错

obj为null的情况

返回false

instanceof 的原理

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>);//编译报错

为什么 p1 instanceof String 编译不通过,而 p1 instanceof List编译能通过? 通过查看Java语言规范Java SE 8版docs.oracle.com/javase/spec…

看到instanceof的伪代码实现:

boolean result;
if (obj == null) {
  result = false;
} else {
  try {
      T temp = (T) obj; // checkcast
      result = true;
  } catch (ClassCastException e) {
      result = false;
  }
}

p1 instanceof String 等价于 (String)p1,明显编译不通过。 p1 instanceof List 等价于(List)p1,编译可以通过。

Class的isInstance()方法

Person p1 = new Person();
Person p2 = new Person();
p1.getClass().isInstance(p2);//true