【问题标题】:Initialising static variable using private static method [duplicate]使用私有静态方法初始化静态变量[重复]
【发布时间】:2016-07-27 14:14:20
【问题描述】:

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

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

    private static varType initializeClassVariable() {

        // initialization code goes here
    }
}

【问题讨论】:

标签: java variables static initialization


【解决方案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?

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2011-08-22
    • 2010-12-22
    • 2017-05-13
    • 2021-10-28
    相关资源
    最近更新 更多