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

新手上路,请多包涵

什么时候加载静态变量,运行时还是编译时?有人可以解释一下吗?

我真的很感激你的帮助。

谢谢你。

原文由 suprasad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 486
2 个回答

它们在运行时加载。

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

原文由 Ralph 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

当您启动 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”如何没有出现在输出的第一行。这是因为必须在执行 main 方法 之前 加载类,这意味着所有静态字段和块都按顺序处理。

原文由 Adriaan Koster 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题