内存中引用变量和对象的逻辑结构/细节?

Max*_*ind 7 java memory heap stack

假设我们有一个班级:

class Class1
{
   int i = 1;
}
Run Code Online (Sandbox Code Playgroud)

我们有一个变量:

Class1 ob1 = new Class1();
Run Code Online (Sandbox Code Playgroud)
  • 引用本身存储在变量中是否ob1存储了它引用的对象的信息Class1
  • Class1存储堆的哪一部分是否存储了Class1类型的信息?
  • 逻辑上如何看待这些信息?它是一个像application1.Class1这样的字符串或对某些引用类型池的引用?

如果您可以推荐这些信息的来源,我将非常感谢提供它,我在参考书中找不到它.

Vis*_*l K 1

存储在变量 ob1 中的引用本身是否存储了它引用 Class1 对象的信息?

。引用变量ob1只存储它所指向的对象的引用。并且应用程序(或 JVM)已经知道有关该对象的信息。

堆中存储Class1的部分是否存储了它是Class1类型的信息?

。正在加载的类的信息存储在方法区中。正如此链接中所指定的
,对于它加载的每种类型,Java 虚拟机必须在方法区中存储以下类型的信息:

  • 类型的完全限定名称
  • 类型的直接超类的完全限定名称(除非类型是接口或类 java.lang.Object,两者都没有超类)
  • 类型是类还是接口
  • 类型的修饰符(public、abstract、final 的一些子集)
  • 任何直接超级接口的完全限定名称的有序列表

这些信息在逻辑上看起来如何?它是像 application1.Class1 这样的字符串还是对某些引用类型池的引用?

在 Java 类文件和 Java 虚拟机内部,类型名称始终存储为完全限定名称。例如,包 java.lang 中的类 Object 的完全限定名称表示为java/lang/Object在方法区域中,完全限定名称可以以设计者选择的任何形式和数据结构来表示。