考虑一个只有静态字段而没有构造函数的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()
时
如果不将对象o1
和o2
也设为static
,则它们对static
上下文不可用。
JVMS指出
类中声明的任何静态初始化程序都将在初始化时执行
进一步
类或接口类型T将在首次出现以下任何一项之前立即初始化:
- T是一个类,并创建了T的实例
- T是一个类,并调用TT声明的静态方法
- 分配了T声明的静态字段
- 使用T声明的静态字段,并且该字段不是常量变量(§4.12.4)
- T是一个顶级类,嵌套在T中的断言语句(§14.10)是已执行
因此,在您的情况下,当静态方法compute()
首次执行时。