instanceof 是 Java 的一个二元运算符,它的作用是测试一个对象是否是指定类型(或其子类型)的实例,它返回一个布尔值:true 或 false。

基本语法
object instanceof Type
- object: 要检查的对象变量,它不能是基本数据类型(如
int,double),必须是引用类型(类、接口、数组)。 - Type: 目标类型,可以是一个类、一个接口、一个数组类型,甚至是
null(但结果永远是false)。
示例:
String str = "Hello World"; Object obj = new Object(); // 检查 str 是否是 String 类的实例 boolean result1 = str instanceof String; // true // 检查 str 是否是 Object 类的实例(String 是 Object 的子类) boolean result2 = str instanceof Object; // true // 检查 obj 是否是 String 类的实例 boolean result3 = obj instanceof String; // false // 检查 null 是否是任何类型的实例 boolean result4 = null instanceof String; // false
工作原理与继承关系
instanceof 的判断是基于继承关系的。object 是 Type 类本身,或者是 Type 类的子类(或实现了 Type 接口)的实例,instanceof 的结果就是 true。
示例:
class Animal {}
class Dog extends Animal {}
public class Test {
public static void main(String[] args) {
Animal myDog = new Dog();
// Dog 是 Animal 的子类,myDog (Dog对象) 也是 Animal 的实例
System.out.println(myDog instanceof Animal); // true
// myDog 的实际类型是 Dog
System.out.println(myDog instanceof Dog); // true
}
}
instanceof 的核心应用场景:类型转换(向下转型)
instanceof 最常见的用途是在向下转型之前进行检查,以避免 ClassCastException(类型转换异常)。

问题场景:
假设我们有一个方法,它接收一个 Object 类型的参数,我们想在这个方法内部,如果这个对象是 String 类型,就进行一些操作。
不安全的做法(会抛出异常):
public void process(Object obj) {
// obj 不是 String 类型,这行代码会抛出 ClassCastException
String str = (String) obj;
System.out.println("Length: " + str.length());
}
// 调用
process("Hello"); // 正常
process(123); // 抛出 java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String
安全的做法(使用 instanceof 检查):
public void process(Object obj) {
// 先检查 obj 是否是 String 的实例
if (obj instanceof String) {
// 只有在确认是 String 类型后,才进行向下转型
String str = (String) obj;
System.out.println("Length: " + str.length());
} else {
System.out.println("The provided object is not a String.");
}
}
// 调用
process("Hello"); // 输出: Length: 5
process(123); // 输出: The provided object is not a String.
instanceof 与接口
instanceof 不仅可以用于类,也可以用于接口,如果一个对象实现了某个接口,instanceof 判断该接口类型时也会返回 true。

示例:
interface Flyable {
void fly();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying.");
}
}
class Airplane implements Flyable {
@Override
public void fly() {
System.out.println("Airplane is flying.");
}
}
class Car {}
public class Test {
public static void main(String[] args) {
Bird bird = new Bird();
Airplane plane = new Airplane();
Car car = new Car();
System.out.println(bird instanceof Flyable); // true, 因为 Bird 实现了 Flyable
System.out.println(plane instanceof Flyable); // true, 因为 Airplane 实现了 Flyable
System.out.println(car instanceof Flyable); // false, 因为 Car 没有实现 Flyable
}
}
Java 14 引入的模式匹配(Pattern Matching for instanceof)
从 Java 14 开始,instanceof 增加了一个新特性:模式匹配,这极大地简化了代码,让你可以在检查类型的同时完成类型转换。
传统方式(Java 14 之前):
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str.toUpperCase());
}
使用模式匹配(Java 14+):
if (obj instanceof String str) { // 注意这里的语法:类型 变量名
// 在 if 语句块内,str 变量已经自动被声明和转换,可以直接使用
System.out.println(str.toUpperCase());
}
优点:
- 代码更简洁:减少了显式的类型转换代码
(String) obj。 - 更安全:变量
str的作用域被限制在if语句块内,避免了在块外误用未转换的变量。 - 可读性更高:意图更清晰,即“
obj是String类型,那么我就把它当作String来用,并命名为str”。
重要规则和注意事项
-
null检查:任何对象与null进行instanceof比较都返回false,这是NullPointerException的天然防护。String s = null; System.out.println(s instanceof String); // false
-
编译时检查:
instanceof的右侧类型必须是可编译的,你不能检查一个不存在的类型。Object obj = "test"; // System.out.println(obj instanceof NonExistentClass); // 编译错误
-
最终类 vs. 非最终类:
instanceof的行为与类是否被final修饰无关,只要存在继承关系,判断就会成立。final class FinalClass {} class SubClass extends FinalClass {} // 错误!final class cannot be extended // 所以对于 final class,instanceof 只能判断它自己 Object obj = new FinalClass(); System.out.println(obj instanceof FinalClass); // true -
数组类型:
instanceof也可以用于检查数组类型。Object obj = new int[10]; System.out.println(obj instanceof int[]); // true System.out.println(obj instanceof String[]); // false
| 特性 | 描述 |
|---|---|
| 作用 | 判断一个对象是否是指定类型(或其子类/实现接口)的实例。 |
| 返回值 | boolean (true 或 false)。 |
| 语法 | object instanceof Type |
| 核心用途 | 在进行向下转型(casting)前进行安全检查,防止 ClassCastException。 |
| Java 14+ 新特性 | 模式匹配,允许在 instanceof 检查的同时声明并转换变量,使代码更简洁、安全。 |
与 null |
null instanceof 任何类型都返回 false。 |
| 与继承 | 如果对象是目标类型的子类实例,instanceof 也返回 true。 |
instanceof 是 Java 面向对象编程和多态处理中一个非常基础且重要的工具,掌握它对于编写健壮、安全的 Java 代码至关重要。
