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

san*_*oid 33 java static final initialization classloader

好吧,所以说我有一个看起来像这样的课程:

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);
}
Run Code Online (Sandbox Code Playgroud)

我可以指望类加载器按顺序初始化这些字段,这样我可以依赖SERVLET_LOGGER在signupObservableAgent之前实例化吗?

Lau*_*ves 52

是的,它们按照它们在源中出现的顺序进行初始化.您可以阅读The Java Language Specification,§12.4.2所有详细信息.见步骤9,其中包括:

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