getclass()是object类中被final修饰的native方法,返回对象运行时实际类型class对象,不可重写以保障类型安全;它严格比较实际类是否完全相同,与instanceof(支持继承关系判断)和==(比较引用)有本质区别。

getClass() 是 Object 类中唯一不能被重写的 final 方法,返回当前对象运行时的实际类(Class 对象)。面试常考它和 instanceof、==、equals() 的区别,以及为什么不能重写、为何用 getClass() 判断类型更严格。
记住它的核心行为:运行时类型,不是声明类型
变量声明类型可能和实际类型不同,getClass() 永远返回new 出来的那个类,不受引用变量类型影响:
- Object obj = new ArrayList(); → obj.getClass() 返回 ArrayList.class,不是 Object.class
- List list = new LinkedList(); → list.getClass() 返回 LinkedList.class,不是 List.class(List 是接口,没有 Class 实例)
对比 instanceof:一个是“是不是”,一个是“到底是谁”
instanceof 检查是否为某类型或其子类型(支持向上转型判断),getClass() 要求必须完全相等:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- new ArrayList() instanceof List → true(ArrayList 实现 List)
- new ArrayList().getClass() == List.class → false(List 是接口,不能 new;且 getClass() 返回的是 ArrayList.class)
- new ArrayList().getClass() == ArrayList.class → true
为什么 getClass() 不能重写?设计意图是什么?
因为它是 JVM 底层直接绑定的 native 方法,语义上必须保证每个对象能真实、不可篡改地暴露自己的运行时类型:
- 如果允许重写,就可能伪造类型信息,破坏类型安全(比如让 String 对象返回 Integer.class)
- 反射、序列化、泛型擦除后类型恢复等机制都依赖它返回真实类型
- 源码里明确写了
public final native Class> getClass();
equals() 中用 getClass() 还是 instanceof?怎么选?
这是高频陷阱题。关键看你的 equals 是否允许跨父子类比较:
- 用 getClass():严格对称,子类和父类对象永远不等(推荐用于不可继承的类,如 String、LocalDateTime)
- 用 instanceof:允许子类实例与父类实例 equals 为 true(但要注意违反 Liskov 替换原则的风险)
- 最佳实践:若类是 final 的,优先用 getClass();若可被继承且需兼容子类,用 instanceof + 类型转换,但要确保逻辑自洽
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










