java、运行时或编译时何时加载静态变量?

java、运行时或编译时何时加载静态变量?,java,Java,静态变量何时加载,是运行时还是编译时?有人能解释一下吗 我真的很感激你的帮助 谢谢。加载类时的运行时间。 -编译时如何加载变量?在加载相应的类时初始化变量。请参阅。它们是在运行时加载的 静态意味着:变量属于类,而不是类的实例。因此,每个静态变量只有一个值,如果类有n个实例,则没有n个值。编译器通过将值嵌入字节码而不是在运行时计算值来优化内联静态final字段 当您第一次启动JVM并加载一个类时(当类以任何方式第一次被引用时,这是由类加载器完成的),任何静态块或字段都会“加载”到JVM中并变得可访

静态变量何时加载,是运行时还是编译时?有人能解释一下吗

我真的很感激你的帮助


谢谢。

加载类时的运行时间。
-编译时如何加载变量?在加载相应的类时初始化变量。请参阅。

它们是在运行时加载的


静态意味着:变量属于类,而不是类的实例。因此,每个静态变量只有一个值,如果类有n个实例,则没有n个值。

编译器通过将值嵌入字节码而不是在运行时计算值来优化内联静态final字段

当您第一次启动JVM并加载一个类时(当类以任何方式第一次被引用时,这是由类加载器完成的),任何静态块或字段都会“加载”到JVM中并变得可访问

示范:

public class StaticDemo {

 // a static initialization block, executed once when the class is loaded
 static {
  System.out.println("Class StaticDemo loading...");
 }

 // a constant
 static final long ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000;

 // a static field
 static int instanceCounter;

 // a second static initialization block
 // static members are processed in the order they appear in the class
 static {
  // we can now acces the static fields initialized above
  System.out.println("ONE_DAY_IN_MILLIS=" + ONE_DAY_IN_MILLIS
    + " instanceCounter=" + instanceCounter);
 }

 // an instance initialization block
 // instance blocks are executed each time a class instance is created,
 // after the parent constructor, but before any own constructors (as remarked by Ahmed Hegazy)
 {
  StaticDemo.instanceCounter++;
  System.out.println("instanceCounter=" + instanceCounter);
 }

 public static void main(String[] args) {
  System.out.println("Starting StaticDemo");
  new StaticDemo();
  new StaticDemo();
  new StaticDemo();
 }

 static {
  System.out.println("Class StaticDemo loaded");
 }

}
输出:

Class StaticDemo loading...
ONE_DAY_IN_MILLIS=86400000 instanceCounter=0
Class StaticDemo loaded
Starting StaticDemo
instanceCounter=1
instanceCounter=2
instanceCounter=3

请注意,“Starting StaticDemo”如何不显示为输出的第一行。这是因为必须先加载类,然后才能执行主方法,这意味着所有静态字段和块都是按顺序处理的。

加载是一个运行时操作。所有内容都在运行时加载。

静态字段在加载类时加载。创建类的文件对象时通常会发生这种情况,但如果以另一种方式使用该类,则这种情况可能会更早发生

静态初始化器是线程安全的,您可以在多个线程中安全地访问该类。这对于创建线程安全的单例而不必使用锁是很有用的


注意:如果使用多个类加载器,则可以多次加载该类(及其静态初始化块运行)。一般来说,在多个类加载器中加载同一个类可能会让人感到困惑,这是可以避免的,但它是受支持的,而且确实有效。

当您键入
java ClassName
时,类会用静态变量加载到JVM中,因此您不需要对象


其中,作为创建对象时JVM加载的实例变量。

在运行时,您的意思是什么时候加载类还是第一次引用该字段?@Jigar是否有任何方法打印类加载日志以进行调试?@gaurav try
-verbose:class
VM选项。所以当你启动可执行文件时,如果你有多个类,它们的所有静态变量都将加载到堆上?@committedandroider:这有点复杂-静态变量在类被使用之前初始化,值得一提的是,实例初始化块将在任何构造函数代码之前和调用父构造函数之后执行。@AdriaanKoster是否有任何方法可以打印类加载日志以进行调试?@gaurav是的,使用-verbose:class启动JVM。另请参见这个问题:是否有任何方法可以打印类加载日志以进行调试?