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
相关产品推荐
相关产品推荐

