instanceof用于判断对象是否为某类或其子类的实例,或是否实现某接口,返回true或false;它要求左操作数为引用类型,右操作数为编译期可确定的类、接口等,null时恒为false,Java 14+支持模式匹配简化写法。

instanceof 用于判断一个对象是否是某个类(或其子类)的实例,或是否实现了某个接口。它在运行时检查对象的实际类型,返回 true 或 false,不能用于基本类型。
基本语法和使用场景
语法格式为:object instanceof Type,其中 Type 必须是类、接口、枚举或记录(Java 14+),且编译期必须能确定该类型与对象引用类型存在继承或实现关系,否则编译报错。
- 左边必须是引用类型变量(或
null);null instanceof AnyType恒为false - 右边类型不能是泛型类型擦除后的原始类型(如
List可以,List<String>不合法) - 常用于向下转型前的安全检查,避免
ClassCastException
配合强制类型转换一起用
典型模式:先用 instanceof 判断,再安全转型。例如处理不同类型的图形对象:
class Shape {}
class Circle extends Shape {}
class Rectangle extends Shape {}
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Shape s = new Circle();
if (s instanceof Circle) {
Circle c = (Circle) s; // 安全转型
System.out.println("这是个圆");
}
支持接口和多层继承
只要对象实际类型实现了指定接口,或继承链中包含该类型,结果就为 true:
-
new ArrayList<>() instanceof List→true -
new String("a") instanceof Object→true(所有类都继承自Object) -
new Date() instanceof Serializable→true(Date实现了该接口)
Java 14+ 的模式匹配简化写法
从 Java 14 开始(正式特性在 Java 16),支持 instanceof 模式匹配,可直接声明并赋值绑定变量:
if (obj instanceof String s) {
System.out.println(s.length()); // s 已自动转型为 String,作用域限于 if 块内
}
这种写法更简洁、安全,且避免重复写类型名和括号,推荐新项目优先使用。

















