Java中的getClass()方法实际上返回什么?

4

我是一名C++程序员,目前正在学习Java。我在理解Java中的getClass()方法方面遇到了困难,非常感谢您提供的任何见解。据我所知,C++的dynamic_cast和Java的getClass()在某种意义上松散相关,因为它们是实现相同目标的不同方法。在C++中,我可以使用dynamic_cast来确定多态类型,而在Java中,我可以使用getClass()来确定对象的最终派生类类型。通过dynamic_cast,我可以获得一个指针;通过getClass(),我获得一个类,但是这个返回类型(类)实际上代表什么呢?它是指向该类的指针吗?


2
C++ 没有反射机制;而 Java 有。getClass() 是进入 Java 反射机制的入口。C++ 没有类似的东西;dynamic_cast 只是一个苍白的影子。 - Igor Tandetnik
它只是一个表示类的所有属性的对象。它包括名称、包等信息,这是您可以使用反射获取成员、方法等引用的对象。但最终它是一个“值对象”,告诉您有关类的信息,但没有直接的相关性和引用/指针级别。 - slipperyseal
它必须是代表类的对象。从实际意义上讲,它是类的运行时体现,因为它支持实例化(一个newInstance方法)。 - Cheers and hth. - Alf
getClass() 返回代表源对象类的 java.lang.Class 对象。您可以在其上使用 Class 的方法。 - Hot Licks
1个回答

4
据我理解,C++的dynamic_cast和Java的getClass()有些松散的联系。C++的typeid操作符提供了更好的比较方式。主要区别在于,在C++中,typeid要求类至少有一个虚函数,而Java中的getClass可以在没有任何限制的情况下对任何类型的对象进行调用。
那么这个返回类型(类)实际上代表什么呢?它表示一个适合在类上进行反射的Class对象 - 这是C++中没有直接对应物的功能。例如,您可以确定类实现的所有接口、类的基类、列出所有方法、列出所有字段、按名称调用方法等等。

getClass()实际上返回一个保存内存地址的对象?那个对象会继承源对象的字段和方法吗? - estmit
@TimothyTse getClass 返回一个在你的对象类中所有对象都通用的对象。例如,如果有两个对象 String x = "x", y="y",调用 x.getClass()y.getClass() 将返回相同的 Class 对象。此外,这也是由 String.class 运算符返回的相同对象。 - Sergey Kalinichenko
@TimothyTse Class 对象并不从实际对象中“继承”任何东西。Class 对象是由编译器准备的;它们具有描述类的字段和方法的列表。 - Sergey Kalinichenko
啊,那么说“Class”对象是在编译时分配的,并且具有某种数据结构来“描述”类的字段和方法,这样说是否准确?我可以问一下它是如何描述字段和方法的吗? - estmit
@TimothyTse 说编译时分配任何东西都不准确,因为分配严格是运行时的事情,但是“Class”对象的数据在编译时完全准备好,所以在运行时要做的就是为其分配空间并将准备好的元数据复制到该空间中。就“Class”描述您的对象的方式而言,学习的最佳方法是通过Oracle的Java反射API教程进行实践。 - Sergey Kalinichenko
感谢您的解释! - estmit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接