Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解静态是java,为什么这是代码中的输出?_Java_Static - Fatal编程技术网

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

试图理解静态是java,为什么这是代码中的输出?,java,static,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

输出:

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)?

因为
静态变量将初始化一次。

调用
新Cup()
的唯一时间是在
Cups
的静态初始化程序块内

无论您创建了多少个
Cups
实例,只要您强制初始化
Cups
类(例如,通过对其调用静态方法),这都只会执行一次

如果每个
Cups
实例需要两个
Cup
实例,则应使用实例字段,例如

Cup(1)
Cup(2)
Cups()
Cups()
Inside main()
然后您将得到以下输出:

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()");
  }
}

java允许您在类中的特殊“静态子句”(有时称为静态块)中对其他静态初始化进行分组

在代码中

Cup(1)
Cup(2)
Cups()
Cup(1)
Cup(2)
Cups()
Inside main()
将只执行一次:
第一次创建该类的对象时,或者第一次访问该类的静态成员时,即使从未创建过该类的对象。

您是否希望
Cup(1)Cup(2)
打印两次?是的,就像main()中的Cup(1)Cup(2)Cups()Cups(1)Cups(2)Cups(),那么您为什么希望这样呢?您有两个静态
Cup
字段,每个字段初始化一次。我的回答对你有意义吗?如果我理解的话,c1和c2已经在一个静态块中初始化。。所以每次创建一个新的Cups对象时都会共享它?这是否解释了为什么Cup只有两个实例?这不是因为它是共享的,而是因为它不是特定于任何特定实例的-如果您只是在
Cups
中调用一个静态方法,而从不创建
Cups
的任何实例,那么您仍然会得到
Cup
的这两个实例。静态变量(和方法)与该类型关联,而不是与该类型的任何特定实例关联。感谢您的解释,那么在我的代码中调用了哪个静态变量?是x还是y?哪一个被忽略了?但是静态cups x和静态cups y不是创建了一个不同的Cup实例吗?@javanob不同的cups是的。但所有实例的静态变量都是相同的。
static {  
    c1 = new Cup(1);
    c2 = new Cup(2);
      }