我们已经讨论过类是复杂数据类型这一事实。现在让我们谈谈类的另一面——Java 机器是如何处理类的。请记住,在 Java 中,一切都是对象,甚至是类。一个类就是一个对象。这让你感到惊讶吗?那我们继续吧。

加载类到内存

实际上,当一个类被加载到内存中时,会创建三个特殊的“对象”:

加载类到内存

插图简要说明:

黄色矩形:

代码文件作为扩展名为“.class”的文件存储在磁盘上。它包含有关类、类的字段和方法的信息,以及编译成字节码的方法的源代码。

橙色矩形:

当 Java 机器将一个类加载到内存中时,它会将字节码编译成特定于计算机处理器和操作系统的机器码。只有 Java 机器可以访问此机器代码。作为 Java 程序员,我们无权访问它。

绿色矩形:

Java 机器创建一个包含类的所有静态变量和方法的对象。您使用类名访问此“对象”。

例如,当您编写 时,您指的是位于类中的静态变量。这个对象是我们的绿色矩形。这就是存储静态变量的地方。java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

蓝色矩形:

当 Java 机器将一个类的代码加载到内存中时,它会创建一个特殊的java.lang.Class对象,该对象存储有关加载的类的信息:它的名称、方法名称、字段名称和类型等。

“Class”这个名字可能有点令人困惑。将其称为 ClassInfo 更有意义,因为此类仅存储有关加载类的一些信息。

您可以使用如下命令获取任何类型的 Class 对象:

Class name = ClassName.class;

例子:

代码 笔记
Class a = String.class;
获取Class包含String类信息的对象
Class b = Object.class;
获取Class包含Object类信息的对象
Class c = Integer.class;
获取Class包含Integer类信息的对象
Class d = int.class;
获取包含有关类型Class信息的对象int
Class e = void.class;
获取包含有关类型Class信息的对象void

您还可以从任何对象获取对类描述对象的引用,因为每个对象都有getClass()从类继承的方法Object

例子:

代码 笔记
Class a = "Hello".getClass();
与相同的对象String.class
Class b = new Integer().getClass();
与相同的对象Integer.class
Class c = Boolean.TRUE.getClass();
与相同的对象Boolean.class