ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
### [显式的静态初始化](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=%e6%98%be%e5%bc%8f%e7%9a%84%e9%9d%99%e6%80%81%e5%88%9d%e5%a7%8b%e5%8c%96) 你可以将一组静态初始化动作放在类里面一个特殊的"静态子句"(有时叫做静态块)中。像下面这样: ~~~ // housekeeping/Spoon.java public class Spoon { static int i; static { i = 47; } } ~~~ 这看起来像个方法,但实际上它只是一段跟在**static**关键字后面的代码块。与其他静态初始化动作一样,这段代码仅执行一次:当首次创建这个类的对象或首次访问这个类的静态成员(甚至不需要创建该类的对象)时。例如: ~~~ // housekeeping/ExplicitStatic.java // Explicit static initialization with "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 cup1; static Cup cup2; static { cup1 = new Cup(1); cup2 = new Cup(2); } Cups() { System.out.println("Cups()"); } } public class ExplicitStatic { public static void main(String[] args) { System.out.println("Inside main()"); Cups.cup1.f(99); // [1] } // static Cups cups1 = new Cups(); // [2] // static Cups cups2 = new Cups(); // [2] } ~~~ 输出: ~~~ Inside main Cup(1) Cup(2) f(99) ~~~ 无论是通过标为 \[1\] 的行访问静态的**cup1**对象,还是把标为 \[1\] 的行去掉,让它去运行标为 \[2\] 的那行代码(去掉 \[2\] 的注释),**Cups**的静态初始化动作都会执行。如果同时注释 \[1\] 和 \[2\] 处,那么**Cups**的静态初始化就不会进行。此外,把标为 \[2\] 处的注释都去掉还是只去掉一个,静态初始化只会执行一次。