1.class Cup {
2. Cup(int marker) { //d.由13行c进入,并打印 Cup(1)
3. System.out.println("Cup(" + marker + ")");
4. }
5. void f(int marker) {
6. System.out.println("f(" + marker + ")");
7. }
8.}
9.class Cups { b.由25行a进入此类
10. static Cup c1;
11. static Cup c2;
12. static {
13. c1 = new Cup(1);//c.碰到new Cup(1),进入Cup(int marker)构造方法
14. c2 = new Cup(2);//f. 执行完d后继续执行并调用Cup(int marker),打印 Cup(2)
15. }
16. Cups() { //h. 由25行进入调用构造方法打印 Cup()
17. System.out.println("Cups()");
18. }
19.}
20.public class ExplicitStatic {
21. public static void main(String[] args) {
22. System.out.println("Inside main()");//j.执行完static方法块后进行非static方法执行,打印Inside main()..后略。。。。
23. Cups.c1.f(99); // (1)
24. }
25. static Cups x = new Cups(); // a.首先加载静态代码,由于初始化了类Cups,所以进入Cups类中 //g,回到此处,碰到new Cups(),调用Cups()构造方法
26. static Cups y = new Cups(); // i.调用完16行构造方法后继续执行static代码块,由于static只分配一次内存,所以不再调用Cups类
27.}
在标记为(1)的行内访问static对象c1的时候,或在行(1)标记为注释,同时(2)行不标记成注释的时候,用于Cups的static初始化模块就会运行。
若(1)和(2)都被标记成注释,则用于Cups的static初始化进程永远不会发生。(由于从static进入类中需要碰到此类的实例化代码才会进入)