java中对象调用getclass()返回其实际运行时类的class对象,体现多态性;该方法为object类final方法,不可重写,且不能对null调用;常用于反射、类型判断等场景。

Java中,对象实例调用 getClass() 方法可以直接获取其运行时的 Class 对象。
getClass() 是 Object 类的 final 方法
所有 Java 类都继承自 Object,因此任何对象实例(非 null)都能调用该方法。它返回的是该实例**实际所属类**的 Class 对象,不受声明类型影响,体现运行时多态性。
- 返回值类型是
Class>,泛型通配符表示具体类型在运行时确定 - 方法被声明为
final,不可重写,保证行为一致 - 不能对
null调用,否则抛出NullPointerException
与 getClass() 相关的常见用法
获取到 Class 对象后,常用于反射、类型判断、泛型擦除后的类型信息还原等场景。
-
判断实际类型:用
obj.getClass() == String.class或obj.getClass().equals(SomeClass.class)(注意避免用==比较不同类加载器加载的 Class) -
获取类名:
obj.getClass().getName()返回全限定名(如"java.lang.String") -
获取简单类名:
obj.getClass().getSimpleName()返回不带包名的名称(如"String") -
获取类加载器:
obj.getClass().getClassLoader()
getClass() 和 .class 的区别
getClass() 是运行时行为,依赖具体实例;而 SomeClass.class 是编译期字面量,不依赖实例,甚至可在 SomeClass 未初始化时使用。
- 对于已知具体类型且有类字面量可用的场景(如
String.class),优先用.class,更高效、更安全 - 当只有对象引用、不知道确切类型(比如参数为
Object)时,必须用obj.getClass() - 子类重写方法但未改变类型时,
getClass()仍返回子类的Class,不是父类
注意泛型和数组的特殊情况
泛型在运行时被擦除,getClass() 返回的是原始类型;而数组是特殊对象,其 Class 对象表示数组类型本身。
-
List<string> list = new ArrayList(); list.getClass()</string>返回ArrayList.class,不是List.class或含泛型信息的类型 -
String[] arr = new String[0]; arr.getClass()返回class [Ljava.lang.String;(JVM 内部表示) - 可通过
arr.getClass().getComponentType()获取元素类型(String.class)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











