为什么必须在静态初始化程序块中调用静态方法(如果在类定义中调用了该方法),除非将输出分配给变量。

public class MyClass {
  int a = staticFunction(); // Allowed.

  static int b = staticFunction(); // Allowed.

  staticFunction(); // Not allowed!

  static  {
    staticFunction(); // Allowed.
  }

  private static int staticFunction() {
    return 1;
  }
}


我猜这是因为JVM不知道在加载类时还是在每次创建对象时是否应调用此方法一次。

最佳答案

不必在静态初始化程序块中调用它;它也可以在实例初始化程序中调用,它看起来像静态初始化程序块,但没有单词static

public class MyClass {

  staticFunction(); // Not allowed!

  {
    staticFunction(); // Allowed.
  }

  private static int staticFunction() {
    return 1;
  }
}


每当您创建新的MyClass对象时,都会调用实例初始化程序。 (通常,如果在构造函数中放入类似的内容,效果会大致相同。但是实例初始化程序对于无法编写自己的构造函数的匿名类很有用。)

10-05 21:29