package initialization;//: initialization/ExplicitStatic.java
// Explicit static initialization with the "static" clause.
import static net.mindview.util.Print.*;class Cup {
  Cup(int er) {
    print("Cup(" + er + ")");
  }
  void f(int er) {
    print("f(" + er + ")");
  }
}class Cups {
  static Cup cup1=new Cup(1);
  static Cup cup2=new Cup(1);
  static {
    cup1 = new Cup(2);
    cup2 = new Cup(2);
  }
  static {
    cup1 = new Cup(3);
    cup2 = new Cup(3);
  }
  Cups() {
    print("Cups()");
  }
}public class ExplicitStatic {
  public static void main(String[] args) {
    print("Inside main()");
    Cups.cup1.f(99);  // (1)
  }
  //static Cups cups1 = new Cups();  // (2)
  // static Cups cups2 = new Cups();  // (2)
} /* Output:
Inside main()
Cup(1)
Cup(2)
f(99)
*///:~
==============================
out:
Inside main()
Cup(1)
Cup(1)
Cup(2)
Cup(2)
Cup(3)
Cup(3)
f(99)
==============================
关于上面这段代码有两个地方想请教一下:
1、调用cup1.f的时候貌似cup2也同时被初始化了。是不是可以理解成只要有一个static方法或者static域被调用那么所有的static域都被创建了呢?
2、static{}和普通的语句好像不太一样呢,这里的cup1和cup2多次被赋值和书上所讲的static域只能一次赋值有点矛盾呢,这是为什么呢?

解决方案 »

  1.   

    static应该是可以多次赋值的,final才是不能改变的编译时常量,
      

  2.   

    可以
    static 属于类,非static的属于对象
      

  3.   

    static一般用于变量时表示常量
      

  4.   

    static可以多次赋值,但最好不要那么做,负责会失去静态变量的意义。
      

  5.   

    我是初学JAVA的 老师也是五楼的说法
      

  6.   


    所以我工作中常见的代码是:
    public static final String UESR_NAME = "user name";