Java中静态变量的初始化顺序

Ben*_*ler 1 java static

我在两个不同的文件中有两个类,每个文件都有一个静态变量,我想知道是否有一种方法可以预测哪一个将首先被初始化(是否依赖于实现)?我的代码看起来像这样?

File1:
public class A
{
  public static boolean a = Logger.log();
}

File2:
public class B
{
  public static boolean b = Logger.log();
}

File3:
public class Logger
{
  public static boolean log();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

这取决于每个班级何时首次使用.

Java语言规范的第12.4.1节:

类或接口类型T将在第一次出现以下任何一个之前立即初始化:

  • T是一个类,并且创建了T的实例.

  • T是一个类,并且调用由T声明的静态方法.

  • 分配由T声明的静态字段.

  • 使用由T声明的静态字段,该字段不是常量变量(第4.12.4节).

  • T是顶级类(第7.6节),并且执行在词典内嵌套在T(第8.1.3节)内的断言语句(第14.10节).

对静态字段(第8.3.1.1节)的引用仅导致实际声明它的类或接口的初始化,即使它可能通过子类的名称,子接口或实现接口的类来引用.

JLS的第12.4.2节详细说明了初始化过程.

说实话,如果你的代码要求一个在另一个之前初始化,尽管没有明显的依赖性,那么你无论如何都会遇到问题.