--- title: "02-instanceof" created: 2025-11-25 tags: - Java --- # instanceof **instanceof** 是 Java 中的二元运算符,用于在运行时检查对象的类型,确保类型转换的安全性或根据类型执行不同逻辑。以下是其核心要点: #### **一、基本语法与用途** - **语法**:**对象 instanceof 类型** - **返回值**:布尔值(**true**/**false**),表示对象是否为该类型或其子类/接口的实例。 - **典型场景**: 1. **类型转换前的安全检查**: ```java if (obj instanceof String) { String str = (String) obj; // 安全转换 } ``` 2. **多态逻辑分支**: ```java if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.bark(); } ``` #### **二、关键特性** 1. **空值处理**: **null instanceof 任何类型** 始终返回 **false**,无需空指针检查。 ```java Object obj = null; System.out.println(obj instanceof String); // false ``` 2. **继承与接口支持**: - 检查对象是否属于类或其父类。 - 检查对象是否实现某接口。 ```java List list = new ArrayList<>(); System.out.println(list instanceof ArrayList); // true System.out.println(list instanceof List); // true System.out.println(list instanceof Serializable); // true ``` 3. **数组类型检查**: ```java int[] arr = new int[5]; System.out.println(arr instanceof int[]); // true System.out.println(arr instanceof Object); // true ``` 4. **泛型类型擦除**: 无法检查泛型具体类型参数(如 **`List`**),运行时仅检查原始类型。 ```java List list = new ArrayList<>(); System.out.println(list instanceof List); // true // System.out.println(list instanceof List); // 编译错误 ``` #### **三、使用注意事项** 1. **基本数据类型**: **instanceof** 仅适用于对象,基本类型需装箱后检查。 ```java int num = 10; // System.out.println(num instanceof Integer); // 编译错误 Integer boxedNum = num; System.out.println(boxedNum instanceof Integer); // true ``` 2. **设计原则**: - **避免滥用**:过度使用可能违反开放-封闭原则,推荐用多态或设计模式(如策略模式、访问者模式)替代。 - **替代方案示例**: ```java // 多态替代 instanceof interface Animal { void sound(); } class Dog implements Animal { public void sound() { System.out.println("Bark"); } } class Cat implements Animal { public void sound() { System.out.println("Meow"); } } ``` 3. **性能影响**: **instanceof** 本身高效,但在复杂继承层次中频繁使用可能影响代码可读性。 #### **四、常见问题与陷阱** 1. **类型擦除与泛型**: ```java List intList = new ArrayList<>(); System.out.println(intList instanceof List); // true System.out.println(intList instanceof List); // true(通配符检查) ``` 2. **接口与实现类**: 接口检查适用于所有实现类,无论层级。 ```java class MyThread extends Thread implements Runnable {} MyThread t = new MyThread(); System.out.println(t instanceof Runnable); // true ``` 3. **数组与多维数组**: ```java String[][] arr2D = new String[2][3]; System.out.println(arr2D instanceof String[][]); // true System.out.println(arr2D instanceof Object); // true ``` #### **五、总结** - **核心作用**:运行时类型检查,保障类型安全,支持灵活逻辑分支。 - **适用场景**:类型转换前校验、多态逻辑处理、接口实现检查。 - **最佳实践**: - 结合 **null** 安全特性简化代码。 - 避免滥用,优先使用多态和设计模式。 - 注意泛型类型擦除限制,理解其行为边界。 合理使用 **instanceof** 能增强代码健壮性,但需遵循设计原则,保持代码简洁与可维护性。 --- ⬅️ [[01-Object通用方法|Object通用方法]] 🏠 [[00-Java|00-Java]] ➡️ [[01-JVM与内存模型|JVM 与内存模型]]