Java判断对象类型有三种方法:instanceof用于判断是否为某类或其子类/接口实例;getClass()==Class.class用于严格匹配本类;Class.isInstance()是instanceof的动态等价写法。

Java 中判断一个对象是不是某个类的实例,核心是区分「是否属于该类型或其子类」和「是否严格等于该类」两种需求。常用方法有三种,各自适用场景不同,选错容易引发逻辑错误。
用 instanceof 判断是否为某类或其子类的实例
这是最常用、最安全的方式,适用于大多数多态场景。它在运行时检查对象是否为指定类、其直接/间接子类,或实现了指定接口。
- 只能用于引用类型,基本类型(如 int、float)直接编译报错
- null 值对任意类型都返回 false,无需提前判空
- 支持类、接口、数组(如 obj instanceof Runnable 或 obj instanceof byte[])
示例:
String s = new StringBuilder().toString();
System.out.println(s instanceof String); // true
System.out.println(s instanceof Object); // true(Object 是所有类的父类)
System.out.println(s instanceof StringBuilder); // false
用 getClass() == Class.class 判断是否严格等于该类
当需要排除继承关系、只认“本尊”时用这个。比如做类型敏感的缓存、序列化校验或策略分发,避免子类误入逻辑分支。
- 调用 obj.getClass() 得到运行时真实类,再与目标类字面量比较(== 安全,Class 对象在 JVM 中单例)
- 子类实例会返回 false,即使它确实是该类的子类型
- 同样不接受 null —— 调用 getClass() 前必须确保 obj != null,否则抛 NullPointerException
示例:
String s = "hello";
StringBuilder sb = new StringBuilder("hi");
System.out.println(s.getClass() == String.class); // true
System.out.println(sb.getClass() == StringBuffer.class); // false(不是 StringBuffer,是 StringBuilder)
用 Class.isInstance() 判断,更灵活的等价写法
这是 instanceof 的面向对象封装版,语义一致但更动态:把类型作为变量传入,适合反射或泛型工具方法中复用。
立即学习“Java免费学习笔记(深入)”;
- String.class.isInstance(obj) 等价于 obj instanceof String
- 可配合 Class> 类型参数使用,避免硬编码类名,提升扩展性
- 同样对 null 返回 false,且支持接口、数组等所有 instanceof 支持的类型
示例:
Object data = new Date();
Class> expectedType = Date.class;
if (expectedType.isInstance(data)) {
System.out.println("data is a Date or its subclass");
}
不需要复杂工具或反射就能解决。关键看你要不要子类——要,就用 instanceof 或 isInstance;不要,就用 getClass() 比较。


















