就象下面这样:
class Spoon {
static int i;
static {
i = 47;
}
尽管上面的代码看起来象个方法,但它实际只是一段跟在 static 关键字后面的代码。与其他
静态初始化动作一样,这段代码仅执行一次:当你首次生成这个类的一个对象时,或者首次
访问属于那个类的一个静态成员时(即便从未生成过那个类的对象)。例如:
//:c04:ExplicitStatic.java
// Explicitstatic initialization with the "static" clause.
import com.bruceeckel.simpletest.*;
class Cup {
Cup(int marker) {
System.out.println("Cup(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Cups {
static Cup c1;
static Cup c2;
static {
c1 = new Cup(1);
c2 = new Cup(2);
}
Cups() {
System.out.println("Cups()");
}
}
public class ExplicitStatic {
static Test monitor = new Test();
public static void main(String[] args) {
System.out.println("Inside main()");
Cups.c1.f(99); // (1)
monitor.expect(new String[] {
"Insidemain()",
"Cup(1)",
"Cup(2)",
"f(99)"
});
}
// static Cupsx = new Cups(); // (2)
// static Cupsy = new Cups(); // (2)
} ///:~
无论是通过标为(1)的那行程序访问静态的 c1 对象,还是把(1)注释掉,让它去运行标为(2)
的那行,Cups 的静态初始化动作都会得到执行。如果把(1)和(2)同时注释掉,Cups 的静态初
始化动作就不会进行。此外,激活一行还是两行(2)代码都无关紧要,静态初始化动作只进
行一次。
