试图理解静态是java,为什么这是这段代码中的输出?

时间:2015-02-21 08:36:41

标签: java static

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 {
  static Cups x = new Cups();
  static Cups y = new Cups();

  public static void main(String[] args) {
    System.out.println("Inside main()");
  }      
} 

输出:

Cup(1)
Cup(2)
Cups()
Cups()
Inside main()

所以有两个静态杯子,     在ExplicitStatic类中,为什么它只显示     杯子(1)&&杯(2)?

3 个答案:

答案 0 :(得分:1)

由于static个变量将被初始化一次。

答案 1 :(得分:1)

new Cup()被调用的唯一时间是Cups的静态初始化程序块。

只会执行一次,但是您创建的Cups的很多实例 - 实际上,即使您没有创建 Cups的任何实例,所以你强制Cups类被初始化(例如通过调用静态方法)。

如果您希望每个Cup 实例有两个Cups个实例,那么您应该使用实例字段,例如。

class Cups {
  Cup c1 = new Cup(1);
  Cup c2 = new Cup(2);

  Cups() {
    // This will execute *after* the field initializers above
    System.out.println("Cups()");
  }
}

然后你得到输出:

Cup(1)
Cup(2)
Cups()
Cup(1)
Cup(2)
Cups()
Inside main()

答案 2 :(得分:0)

java允许您将其他静态初始化分组到特殊的" 静态子句" (有时称为静态块)在类中。

代码

static {  
    c1 = new Cup(1);
    c2 = new Cup(2);
      }

只会执行一次: 第一次创建该类的对象或第一次访问该类的静态成员时,即使您从未创建该类的对象。