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)?
答案 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);
}
只会执行一次: 第一次创建该类的对象或第一次访问该类的静态成员时,即使您从未创建该类的对象。