何时加载静态变量,运行时或编译时?有人可以解释一下。
我真的很感激帮助。
谢谢。
答案 0 :(得分:79)
编译器通过在字节码中嵌入值而不是在运行时计算值来优化可内联的静态最终字段。
当你第一次启动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方法,这意味着将按顺序处理所有静态字段和块。
答案 1 :(得分:18)
它们在运行时加载。
静态意味着:变量属于类,而不属于类的实例。因此,每个静态变量只有一个值,如果你有n个类的实例,则不是n个值。
答案 2 :(得分:5)
加载类时的运行时间。 - Have a look at initialization
答案 3 :(得分:3)
加载类时会加载静态字段。这通常发生在创建类的文件对象时,但如果以另一种方式使用该类,它可以更早。
静态初始化程序是线程安全的,您可以安全地访问多个线程中的类。这可以作为一种创建线程安全单例的方法,而无需使用锁。
注意:如果使用多个类加载器,则可以多次加载类(及其静态初始化块运行)。通常,在多个类加载器中加载相同的类可能会令人困惑并且可以避免,但它受支持并且确实有效。
答案 4 :(得分:1)
如何在编译时加载变量?加载相应的类时,变量已初始化。请参阅JVMS。
答案 5 :(得分:0)
加载是一个运行时操作。一切都在运行时加载。
答案 6 :(得分:0)
当您键入java ClassName
时,类会使用静态变量加载到JVM中,因此您不需要对象。
在创建对象时由JVM加载的实例变量。