java类初始化时机
程序员文章站
2022-05-21 19:28:05
...
Java类初始化时机:
静态方法(构造器隐式是静态的)的首次引用
非常数静态域的首次引用。
从以下例子中可以看出:
import java.util.*;
class Initable {
static final int staticFinal = 47;
static final int staticFinal2 =
ClassInitialization.rand.nextInt(1000);
static {
System.out.println("Initializing Initable");
}
}
class Initable2 {
static int staticNonFinal = 147;
static {
System.out.println("Initializing Initable2");
}
}
class Initable3 {
static int staticNonFinal = 74;
static {
System.out.println("Initializing Initable3");
}
}
public class ClassInitialization {
public static Random rand = new Random(47);
public static void main(String[] args) throws Exception {
Class initable = Initable.class;
System.out.println("After creating Initable ref");
// Does not trigger initialization:
System.out.println(Initable.staticFinal);
// Does trigger initialization:
System.out.println(Initable.staticFinal2);
// Does trigger initialization:
System.out.println(Initable2.staticNonFinal);
Class initable3 = Class.forName("Initable3");
System.out.println("After creating Initable3 ref");
System.out.println(Initable3.staticNonFinal);
}
} /* Output:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
After creating Initable3 ref
74
*///:~
初始化有效地实现了尽可能的“惰性”。从对initable引用的创建中可以看到,仅使用.class语法来获得对类的引用不会引发初始化。但是,为了产生Class引用,Class.forName()立即就进行了初始化。
如果一个static final值是编译器常量,就像Initable.staticFinal那样,那么这个值不需要对Initable类进行初始化就可以被读取。但是如果只是将一个域设置为static和final的,还不足以确保这种种行为,例如,对Initable.staticFinal2的访问将进行类的初始化,因为它不是一个编译器常量。
如果一个static域不是final的,那么在对它访问时,总是要求在它被读取之前,要先进行链接(为这个域分配存储空间)和初始化(初始化该存储空间),就像在对Initable2.staticNonFinal的访问中所看到的那样。
上一篇: 广度和深度优先遍历
下一篇: JVM中类的初始化时机
推荐阅读
-
Oracle培训(十)——Core Java第十章知识点总结——Object类 包装类 内部类
-
PHP调用lucene(java类)的问题
-
Java: LocalDate、LocalDateTime、Duration、Period、TimeUnit类的一些用法
-
Java中的 时间日期的操作类(Calendar)
-
Java8语法中获取程序耗时以及Period,Duration,ChronoUnit类的使用
-
Java8中使用以下类计算日期时间差:Period、Duration、ChronoUnit
-
Java8中使用以下类计算日期时间差:Period、Duration、ChronoUnit
-
加密解密 - Java Aes 类,可否用 php 实现,求助于懂 Java 代码的 php 程序猿
-
【Java源码】集合类-ArrayDeque
-
JAVA对象和类