它们在运行时加载。
静态的意思是:变量属于类,而不属于类的实例。 因此每个静态变量只有一个值,如果您有n个类实例,则不是n个值。
编译器通过在字节码中嵌入值而不是在运行时计算值来优化可内联的静态最终字段。
当您启动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方法,这意味着按顺序处理所有静态字段和块。
类加载时的运行时。 -查看初始化