Java :静态最终字段初始化的顺序是什么?

好吧,假设我有一个看起来像这样的类:

public class SignupServlet extends HttpServlet {
    private static final Logger SERVLET_LOGGER=COMPANYLog.open(SignupServlet.class);
    private static final ExceptionMessageHandler handler = new ExceptionMessageHandler();   
    private static final SignupServletObservableAgent signupObservableAgent = 
        new SignupServletObservableAgent(null, SERVLET_LOGGER);
}

我是否可以依靠类装入器按顺序初始化这些字段,以便我可以依赖SERVLET_LOGGER在注册ObservableAgent之前进行实例化?


答案 1

是的,它们按照它们在源中出现的顺序进行初始化。您可以在 Java 语言规范 §12.4.2 中阅读所有血腥的细节。请参阅步骤 9,内容如下:

...以文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样,除了最终类变量和其值为编译时常量的接口的字段首先初始化...


答案 2

我认为静态字段的初始化可以重新排序。至少这就是我对JMM规范的理解

在许多情况下,对程序变量(对象实例字段、类静态字段和数组元素)的访问可能显示为以与程序指定的顺序不同的顺序执行。