对于jvm来说 类中的静态变量不是应该在类加载的时候就存在了方法区里面么? 那假如说 我定义了一个类A 然后在类B里面定义了一个静态变量
static A s1 = new A();
那请问这个静态变量在初始化的时候 内存图是怎样的呢?
对于这种情况,s1 这个静态变量是在类 B 初始化时被赋值的,因为这时类 B 已经被加载了,而类 A 可能还没有被加载。因此,在 s1 被赋值之前,jvm 会先加载并初始化类 A,然后再为 s1 赋值。具体的内存图如下:
开始加载类 B,jvm 发现其中定义了一个静态变量 s1。
类 B 开始初始化,jvm 发现 s1 还没有被赋值,因此需要为其赋值。
jvm 发现 s1 是一个类 A 的实例,因此需要先加载并初始化类 A。
类 A 开始初始化,jvm 发现其中可能存在静态变量和静态代码块,需要依次执行它们。
类 A 的静态代码块执行完毕,jvm 将类 A 的静态变量放到方法区中。
jvm 回到类 B 的初始化过程,将类 A 的实例赋值给 s1。
因此,最终的内存图应该是类 A 的静态变量和类 B 的静态变量都在方法区中,s1 中存储的是类 A 的实例的引用。