2

考虑一个只有静态字段而没有构造函数的 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;
   }
}

在不同的类中,使用该方法compute,或者通过static import

static import OnlyStatic.compute
int a = OnlyStatic.compute(3);

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

int a = OnlyStatic.compute(3);

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

4

1 回答 1

5

如果不创建对象,这些对象o1o2对您的static上下文不可用static

JVMS指出

类中声明的任何静态初始化器都会在类初始化时执行

更远

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

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

compute()所以在你的情况下,当第一次执行静态方法时。

于 2012-02-20T13:02:31.547 回答