getClass()方法返回对象实际运行时的类信息,是final方法不可重写,准确反映JVM中实例化的具体类型,适用于精确类型校验,不考虑继承关系,常用于获取类名、方法、字段等元数据。

Java 中,Object 类的 getClass() 方法用于获取对象**实际运行时的类信息**,返回一个 Class<?> 对象。它不会受声明类型影响,只取决于对象**在内存中真正创建的类型**。
getClass() 返回的是运行时真实类型
即使变量声明为父类或接口类型,只要它引用的是子类实例,getClass() 就返回子类的 Class 对象。
例如:
Object obj = new String("hello");
System.out.println(obj.getClass()); // class java.lang.String
List<String> list = new ArrayList<>();
System.out.println(list.getClass()); // class java.util.ArrayList
不能被重写,始终反映实际类型
getClass() 是 final 方法,子类无法覆盖。因此它永远安全、准确地给出 JVM 当前加载并实例化的具体类,不受多态伪装干扰。
立即学习“Java免费学习笔记(深入)”;
- 适合做类型校验(比如判断是否为某个具体实现类)
- 比
instanceof更精确:后者只能判断是否可赋值,而getClass()能区分ArrayList和LinkedList - 注意:它不考虑继承关系,
new ArrayList<>().getClass() == new LinkedList<>().getClass()为false
常与 Class API 配合使用
拿到 Class 对象后,可以进一步获取类名、泛型信息、方法、字段等元数据:
-
obj.getClass().getSimpleName()→ 获取简单类名(如"String") -
obj.getClass().getName()→ 获取全限定名(如"java.lang.String") -
obj.getClass().getDeclaredMethods()→ 获取本类声明的所有方法(不含继承) -
obj.getClass().isInterface()→ 判断是否为接口
和 getClass().getSuperclass() 的区别
getClass() 给出当前实例的**直接类型**;而 getClass().getSuperclass() 才是它的父类(如 ArrayList.class.getSuperclass() 返回 AbstractList.class)。不要混淆两者用途。


















