static初始化2(thinking in java 经典例子)

来源:互联网 发布:淘宝店面装修咋弄 编辑:程序博客网 时间:2024/05/24 06:30
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进入类中需要碰到此类的实例化代码才会进入)
原创粉丝点击