什么时候在java,运行时或编译时加载静态变量?

sup*_*sad 30 java

何时加载静态变量,运行时或编译时?有人可以解释一下吗.

我真的很感激帮助.

谢谢.

Adr*_*ter 81

编译器通过在字节码中嵌入值而不是在运行时计算值来优化可内联的静态最终字段.

当你第一次启动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");
 }

}
Run Code Online (Sandbox Code Playgroud)

输出:

Class StaticDemo loading...
ONE_DAY_IN_MILLIS=86400000 instanceCounter=0
Class StaticDemo loaded
Starting StaticDemo
instanceCounter=1
instanceCounter=2
instanceCounter=3
Run Code Online (Sandbox Code Playgroud)

注意'Starting StaticDemo'不会作为第一行输出出现.这是因为必须执行main方法之前加载类,这意味着将按顺序处理所有静态字段和块.


Ral*_*lph 18

它们在运行时加载.

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

  • @committedandroider:它有点复杂 - 静态变量在类在任何地方使用之前被初始化 (2认同)

Jig*_*shi 5

加载类时的运行时间。- 看一下初始化

  • 在运行时,您是说何时加载类或何时首次引用该字段? (2认同)