instanceof 运算符用于运行时判断对象是否为某类、其子类或所实现接口的实例,返回 boolean 值;要求左操作数为引用类型(非 null),右操作数为兼容的类、接口或数组类型,编译期检查类型关系,不支持泛型具体参数。

instanceof 运算符用于在运行时判断一个对象是否是某个类(或其子类)的实例,或者是否实现了某个接口。它返回 boolean 类型值:如果对象属于指定类型(包括继承关系或实现关系),结果为 true;否则为 false。
基本语法和使用条件
格式为:object instanceof Type
- 左边必须是引用类型变量(不能是基本类型或 null)
- 右边必须是类名、接口名,或数组类型(如 String[])
- 编译期会检查类型兼容性:如果对象的编译时类型与右边类型完全无关(无继承/实现关系),编译直接报错
常见正确用法示例
假设定义了如下类结构:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
interface Pet {}
class Puppy extends Dog implements Pet {}
- new Dog() instanceof Animal → true(子类实例属于父类类型)
- new Puppy() instanceof Pet → true(实现接口)
- new Cat() instanceof Dog → false(无关类)
- null instanceof AnyType → false(任何对 null 使用 instanceof 都返回 false)
配合类型转换避免 ClassCastException
典型安全转型写法:
立即学习“Java免费学习笔记(深入)”;
Object obj = new Dog();
if (obj instanceof Dog) {
Dog dog = (Dog) obj; // 此时强转是安全的
dog.bark();
}
- 先用 instanceof 检查,再强制转换,可防止运行时抛出 ClassCastException
- JDK 14+ 支持模式匹配(需开启预览特性):if (obj instanceof Dog d) { d.bark(); },自动完成检查+赋值
注意编译期限制和陷阱
以下代码无法通过编译:
String s = "hello";
if (s instanceof Integer) { ... } // 编译错误:String 和 Integer 无继承关系
- 编译器会做“可及性检查”:若两个类型在继承体系中完全不相交,直接拒绝
- 但接口和类之间只要存在实现可能(即使当前没实现),就允许 instanceof(因为子类可能实现)
- 泛型擦除后,instanceof 无法检测具体泛型类型,如 list instanceof ArrayList<String> 是非法的,只能写 list instanceof ArrayList

















