getclass() 方法返回对象运行时的 class 对象,判断类型是否相同需用 == 比较两个 getclass() 结果;它反映精确动态类型,不支持泛型区分,且与 instanceof 的可赋值性判断有本质区别。

getClass() 方法本身不直接“判断”两个对象是否属于同一类型,而是返回对象运行时的 Class 对象;要判断类型是否相同,需配合 == 比较两个 getClass() 的返回值。
getClass() 返回的是运行时类对象
每个对象调用 getClass() 都会返回其**实际创建时的类**(即动态类型),不受声明类型影响。例如:
```java
Object a = new ArrayList();
Object b = new LinkedList();
System.out.println(a.getClass() == b.getClass()); // false
```
即使都声明为 Object,a 和 b 的运行时类分别是 ArrayList 和 LinkedList,所以 getClass() 返回不同,比较结果为 false。
用 == 比较 getClass() 结果才是正确方式
Class 对象在 JVM 中是单例的,同一类的 getClass() 总返回同一个引用,因此必须用 ==(引用相等),而不是 .equals() 或 instanceof:
-
✅ 正确:
obj1.getClass() == obj2.getClass() -
❌ 不推荐:
obj1.getClass().equals(obj2.getClass())(虽结果通常一致,但无必要且略低效) -
❌ 错误用途:
obj1.getClass() instanceof Class(语法合法但无意义)
注意与 instanceof 的关键区别
getClass() == 判断的是**精确类型一致**(不包括父子类关系),而 instanceof 判断的是**可赋值性**(允许子类):
```java
ArrayList
List
System.out.println(list.getClass() == iface.getClass()); // true(都是 ArrayList)
System.out.println(iface instanceof ArrayList); // true
System.out.println(iface.getClass() == ArrayList.class); // true
System.out.println(iface.getClass() == List.class); // false(List 是接口,不能 new)
特别注意:List.class 是接口的 Class 对象,任何实例的 getClass() 都不会等于它(因为接口不能被实例化)。
泛型擦除不影响 getClass() 判断
Java 泛型在运行时被擦除,getClass() 无法区分 ArrayList<string></string> 和 ArrayList<integer></integer>:
```java
ArrayList
ArrayList
System.out.println(sList.getClass() == iList.getClass()); // true(都是 ArrayList)
所以 getClass() 只能识别**原始类型**,不能反映泛型参数。如需类型参数信息,需借助 ParameterizedType 等反射手段,且仅适用于字段、方法签名等编译期保留的场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











