静态类何时初始化?

Ada*_*tan 2 java import initialization static-import

考虑一个只有静态字段Java类,没有构造函数:

public class OnlyStatic {
   static O1 o1 = new o1();
   static O2 o2 = new o2();

   public static int compute(int whatever) {
       return o1.foo+o2.bar+whatever;
   }
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,使用该方法compute,或者通过static import:

static import OnlyStatic.compute
int a = OnlyStatic.compute(3);
Run Code Online (Sandbox Code Playgroud)

或者直接假设调用者在同一个包中:

int a = OnlyStatic.compute(3);
Run Code Online (Sandbox Code Playgroud)

o1和o2何时初始化?在导入时,还是compute()第一次调用时?

Joh*_*erg 5

对象o1并且o2static没有制作它们的情况下static也不可用于您的上下文.

JVMS说明了这一点

在类初始化时,将执行在类中声明的任何静态初始化程序

进一步

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

  • T是一个类,并且创建了T的实例.
  • T是一个类,并且调用由T声明的静态方法.
  • 分配由T声明的静态字段.
  • 使用由T声明的静态字段,该字段不是常量变量(第4.12.4节).
  • T是顶级类,并且执行在词典内嵌套在T中的断言语句(第14.10节).

所以在你的情况下,compute()首次执行静态方法时.