You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Object类的final方法getClass为何返回实际对象类型?

关于getClass()方法与静态绑定的疑问

问题描述

学习静态绑定时了解到,private、final、static方法采用静态绑定,静态绑定使用类型信息进行绑定,而动态绑定则通过对象解析绑定。但getClass()是final方法,为何它返回的是实际对象的类型而非引用类型?比如以下代码中,A c = new B(),调用c.getClass()得到的结果是B,而非预期的A:

package BasePackage;

class A {

}
class B extends A {

}

public class project2{
    public static void main(String[] args){
        A a = new A();
        B b = new B();
        A c = new B();

        Class clazz1=c.getClass();
        System.out.println(clazz1.getName());
        System.out.println(clazz1.getSimpleName());
        System.out.println(clazz1.getPackageName());
        System.out.println(clazz1.getPackage());
        System.out.println(clazz1.getPackage().getName());
    }
}

解答

要搞清楚这个问题,得把方法的绑定机制和方法的功能逻辑分开来看:

  • 静态绑定的核心是:编译器在编译阶段就能确定要调用的方法实现。因为getClass()是Object类的final方法,子类无法重写,所以编译时就确定了调用的是Object类中定义的getClass(),这部分确实是静态绑定的逻辑。
  • 但getClass()方法本身的功能,是返回运行时实际创建的对象类型。JVM在运行时会通过对象头里的类型指针,读取该对象对应的Class元数据,这个过程和绑定机制无关——不管引用变量声明的是什么类型,它只会返回实际new出来的那个类的信息。

简单来说:静态绑定决定了“要调用哪个方法”,而getClass()的方法逻辑决定了“这个方法要返回什么结果”。就像你用一个标着“水果”的袋子(引用类型A)装了一个苹果(实际对象B),getClass()就是专门用来查看袋子里实际装的是什么的工具,而且这个工具的逻辑是固定的(final不能改),所以它一定会告诉你里面是苹果。

内容的提问来源于stack exchange,提问作者CD S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:32:04