使用私有静态方法初始化静态变量

时间:2016-04-06 22:44:53

标签: java variables static initialization

根据Java教程Oracle,私有静态方法可用于初始化静态变量。我只是想知道public static varType myVar = initializeClassVariable();什么时候被执行?是在实例化Whatever类的新实例期间还是仅在首次使用时初始化?

class Whatever {
    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        // initialization code goes here
    }
}

1 个答案:

答案 0 :(得分:1)

正如@ elliott-frisch所说,简单的答案在JLS中:

https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.7 https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2

只要在正在运行的程序中引用了一个类,它就会被加载 - 哪个 表示访问class实例本身或创建该类的新实例。

加载类涉及扫描可能包含该特定类的jar的类路径,读取生成的jar并从jar加载/验证相关的字节码。完成此操作后,将识别并执行该类的相关类级初始化块。在实例化类的任何实例之前发生的所有事情。

有一点需要注意的是,所有这些都局限于特定的类加载器。多个类加载器最终可能会在相同或不同的时间为同一个类执行完全相同的步骤。因此,相同的静态初始化程序可以在同一个JVM中多次执行,但在单个类加载器实例中只能执行一次。

基本上 - 对类的任何引用都会导致加载该类,但只加载引用的类。仅仅因为引用的类位于jar中,并不意味着将加载jar中的其他类。

When does the JVM load classes?