Java允许我们将其他static初始化工作划分到类内一个特殊的“static构建从句”(有时也叫作“静态块”)里。它看起来象下面这个样子:
class
Spoon
...
{
static int i;
static ...{
i = 47;
}
// . . .
static int i;
static ...{
i = 47;
}
// . . .
尽管看起来象个方法,但它实际只是一个static关键字,后面跟随一个方法主体。与其他static初始化一样,这段代码仅执行一次——首次生成那个类的一个对象时,或者首次访问属于那个类的一个static成员时(即便从未生成过那个类的对象)。例如:
//
: ExplicitStatic.java
// Explicit static initialization
// with the "static" clause.
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 ... {
public static void main(String[] args) ...{
System.out.println("Inside main()");
Cups.c1.f(99); // (1)
}
static Cups x = new Cups(); // (2)
static Cups y = new Cups(); // (2)
} // /:~
// Explicit static initialization
// with the "static" clause.
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 ... {
public static void main(String[] args) ...{
System.out.println("Inside main()");
Cups.c1.f(99); // (1)
}
static Cups x = new Cups(); // (2)
static Cups y = new Cups(); // (2)
} // /:~
在标记为(1)的行内访问static对象c1的时候,或在行(1)标记为注释,同时(2)行不标记成注释的时候,用于Cups的static初始化模块就会运行。若(1)和(2)都被标记成注释,则用于Cups的static初始化进程永远不会发生。