getClass() 返回对象运行时实际类型,与声明类型无关,只取决于 new 创建的具体类;它通过对象头 Klass Pointer 获取 Class 实例,严格匹配精确类,不考虑继承关系。

getClass() 返回的是运行时实际对象的类型,与变量声明类型无关,这是 Java 多态中类型识别的核心机制。
getClass() 总是返回真实运行时类
在继承关系中,即使父类引用指向子类对象,getClass() 也始终返回该对象在堆内存中实际创建的类。它不看声明类型,只看 new 出来的那个类。
- 父类引用变量只是“视角”,JVM 在运行时通过对象头中的类型指针定位真实类信息
- 返回值是
Class<?>对象,可通过getName()、getSimpleName()或isAssignableFrom()进一步判断 - 它和
instanceof行为不同:instanceof支持向上转型判断(如子类对象 instanceof 父类为 true),而getClass() == XXX.class是严格等价匹配
与 instanceof 的关键区别
多态下常混淆 getClass() 和 instanceof 的用途:
-
obj instanceof Parent→ 判断 obj 是否为 Parent 类型或其任意子类实例(含自身),结果为 true -
obj.getClass() == Parent.class→ 仅当 obj 恰好是 Parent 类直接实例时才为 true,子类实例会返回 false - 例如:若
Child extends Parent,且Parent p = new Child();,则p instanceof Parent为 true,但p.getClass() == Parent.class为 false
典型使用场景与注意事项
常见于需要精确区分具体实现类的逻辑,比如序列化、反射调用、equals 方法实现等:
立即学习“Java免费学习笔记(深入)”;
- 在重写
equals()时,常用getClass() != obj.getClass()做快速类型校验,避免跨子类比较(比instanceof更严格) - 反射中根据运行时类获取特定方法或字段,如
obj.getClass().getMethod("doWork"),确保调用的是该实例实际拥有的方法 - 注意:getClass() 不受泛型擦除影响,可准确反映原始类型;但对数组、基本类型包装类等需留意返回的是运行时 Class(如 int[].class、Integer.class)
慎用 getClass() 做业务逻辑分支
虽然能精确识别类型,但过度依赖 getClass() 容易破坏多态设计原则:
- 用大量
if (obj.getClass() == A.class) { ... } else if (obj.getClass() == B.class) { ... }本质是模拟 switch-type,违背开闭原则 - 更推荐用抽象方法、策略模式或访问者模式将行为委托给具体类,让 JVM 自动分派
- 只有在必须绕过动态绑定(如调试、框架底层、类型安全容器)时,才应直接使用 getClass()


















