class 在 Java 中是否有(唯一)身份?

Does a class have a (unique) identity in Java?

是语句“A​​ class 具有唯一标识。”是真是假?

java 中的对象有其唯一标识(至少通过它们的内存地址),但是 class 中的对象也有吗?由于 class 不是对象,我对此感到困惑。或者 class 是否需要实例化(甚至可能)?

它的名字是它的唯一标识符,如果你把它放在包里的话。

首先,class 在包级别必须是唯一的,但您可以在不同的包中使用相同的 class 名称。考虑 java.util.Timerjava.swing.Timer。还有很多其他的例子。

而且并不是所有的classes都需要实例化才能使用。考虑具有静态方法的 Math class。

每个 class 都有一个关联实例(Object.class 对应 Object class)。此实例在每个 class 加载器 中是唯一的 。这意味着 class 在 class 加载程序中确实有一个唯一标识。但是,相同的 Foo class 可以在 JVM 中加载两次,例如在一个容器的两个不同的 webapps 中。

另请注意,« system classes » 始终由根 class 加载程序加载,因此在 JVM 中具有唯一标识。

真假皆可,取决于你对身份的定义。

因为 类 通过它们的完全限定名称 (FQN) 定位并加载到 JVM 中,例如java.lang.String,很容易认为这些 FQN 是唯一的,但 Java 程序可以有多个 ClassLoader 个实例 运行,每个实例都有自己的 类 版本加载共享相同的 FQN。这些 类 及其实例将无法通过代码中的相等性检查,并且无法相互转换,即使它们是从磁盘上的同一个 .class 文件加载的。

所以这个说法是错误的,因为可以有多个 类 加载相同的标识,但这个说法是正确的,因为它们在 JVM 的眼中都是唯一可区分的。