JAVA学习笔记--instanceof关键字
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
严格来说,instanceof 是 Java 的一个二元操作符(双目运算符),类似于 ==,>,< 等操作符。用来测试一个对象是否是为一个类的实例,用法为:
boolean result = obj instanceof class
其中 obj 为一个对象,Class 表示一个类或者一个接口。
当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
重点:
值得注意的是 obj 必须为引用类型,不能是基本类型。例如以下代码:
int i = 0; System.out.println(i instanceof Integer); // 编译不通过 System.out.println(i instanceof Object); // 编译不通过
所以,instanceof 运算符只能用作对象的判断。
当 obj 为 null 时,直接返回 false,因为 null 没有引用任何对象。
int i = 0; System.out.println(i instanceof Integer); // 编译不通过 System.out.println(i instanceof Object); // 编译不通过
所以,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<Person>
又不能通过编译
可以理解成以下代码:
boolean result; if (obj == null) { result = false; // 当obj为null时,直接返回false } else { try { // 判断obj是否可以强制转换为T T 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
可以通过编译。