Java 静态变量如何在类加载时获取对象的值?

Java 静态变量如何在类加载时获取对象的值?,java,jvm,Java,Jvm,由于静态变量在加载类时获得内存,因此我在这里通过创建新的A()来分配它,该函数将在加载类后的运行时分配。jvm如何在加载类时分配新的A()的值? public class A{ static A objA =new A(); public static void main(String x[]){} } 这里没什么奇怪的。加载该类,然后创建newa(),并将其分配给objA。它在内部的实际发生方式并不相关,在JVM之间可能会有所不同。这里没有什么奇怪的。加载该类,然后创建newa(),并将其分

由于静态变量在加载类时获得内存,因此我在这里通过创建新的A()来分配它,该函数将在加载类后的运行时分配。jvm如何在加载类时分配新的A()的值?

public class A{
static A objA =new A();
public static void main(String x[]){}
}

这里没什么奇怪的。加载该类,然后创建
newa()
,并将其分配给
objA
。它在内部的实际发生方式并不相关,在JVM之间可能会有所不同。

这里没有什么奇怪的。加载该类,然后创建
newa()
,并将其分配给
objA
。它在内部的实际发生方式并不相关,在JVM之间可能会有所不同。

加载类时,JVM调用名为
()V
的类中的方法。该方法设置所有初始值,在您的情况下,它设置静态字段


它可以在调用该方法时创建实例,但这确实意味着您不能在构造函数中假设所有静态字段都已设置好。

加载类时,JVM调用名为
()V
的类中的方法。该方法设置所有初始值,在您的情况下,它设置静态字段


它可以在调用方法时创建实例,但这确实意味着,如果您这样做,您不能在构造函数中假设所有静态字段都已设置。

我建议您阅读bill venners提供的jvm内部的
我建议您阅读bill venners提供的jvm内部的
,因为静态变量在同一类的多个对象之间共享公共内存区域,所以静态变量为几个对象获得了一次内存。稍后会创建一个以上的点对象,而不是在类加载时。jvm如何在类加载时分配它?@ArpitDubey-不是类加载。该类已加载。静态字段在类初始化期间被赋值/初始化。所以类定义已经在JVM/方法区域中了。@lostmind谢谢你。您的平均静态变量在类加载时获得内存,但它们在初始化时初始化,然后jvm从方法区域中选取代码。@ArpitDubey-否。类加载的意思是-类应包含的内容,并将元数据添加到方法区域。类初始化意味着-静态字段已初始化。@我首先感到困惑的是,请指定I)-方法区域ii)-堆内存iii)-堆栈中的代码,因为静态变量在同一类的多个对象之间共享公共内存区域,所以静态变量为多个对象获得了一次内存。稍后会创建一个以上的点对象,而不是在类加载时。jvm如何在类加载时分配它?@ArpitDubey-不是类加载。该类已加载。静态字段在类初始化期间被赋值/初始化。所以类定义已经在JVM/方法区域中了。@lostmind谢谢你。您的平均静态变量在类加载时获得内存,但它们在初始化时初始化,然后jvm从方法区域中选取代码。@ArpitDubey-否。类加载的意思是-类应包含的内容,并将元数据添加到方法区域。类初始化意味着-静态字段已初始化。@如果我不清楚,请指定在I)-方法区域ii)-堆内存iii)-堆栈示例中执行的代码,以显示此行为(加载类时,其字段首先设置为默认值,然后从上到下初始化)。显示此行为的示例(加载类时,其字段首先设置为默认值,然后从上到下初始化)。