instanceof判断对象运行时类型是否为指定类或其子类型,仅适用于引用类型;null时返回false,基本类型编译报错,jdk14+支持模式匹配自动绑定变量。

instanceof 判断的是对象的**运行时类型(即实际创建的类)是否为指定类型或其子类型**,而不是声明类型。它只对引用类型有效,且左侧操作数为 null 时结果恒为 false。
instanceof 看的是 new 出来的那个类
变量声明类型不影响判断,真正起作用的是对象在堆中由哪个类的 new 表达式创建的。
- 如果
A a = new B();,且B extends A,那么a instanceof B为true,a instanceof A也为true - 如果
A a = null;,则a instanceof A是false(不会抛异常) - 基本类型(如
int、char)不能用instanceof,编译直接报错
只能用于有继承/实现关系的类型之间
左右两边必须有明确的类型兼容性,否则编译不通过。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
String s = "abc"; s instanceof Object✅(String是Object子类) -
String s = "abc"; s instanceof Date❌ 编译错误(String和Date无继承或实现关系) - 接口也适用:
List list = new ArrayList(); list instanceof ArrayList✅;list instanceof List✅
常用于类型安全的向下转型前检查
避免 ClassCastException,是典型的“先检查再转换”模式。
- 错误写法:
Object obj = "hello"; String s = (String) obj;—— 看似安全,但若obj实际是Integer就崩溃 - 正确写法:
if (obj instanceof String) { String s = (String) obj; /* 安全使用 */ } - JDK 14+ 支持模式匹配(
if (obj instanceof String s)),自动绑定并省略显式强转
注意:数组和泛型擦除不影响 instanceof 判断
数组类型是真实存在的运行时类型;泛型信息虽被擦除,但 instanceof 检查的是原始类型。
-
Object arr = new int[5]; arr instanceof int[]→true -
List<string> list = new ArrayList(); list instanceof ArrayList</string>→true(不是List<string></string>,因为泛型不存在于运行时) -
list instanceof List→true;但list instanceof List<string></string>❌ 编译错误(带泛型的参数化类型不能用于 instanceof)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










