在类定义中何时可以调用静态方法的约束背后的推理



为什么在类定义中调用的静态方法必须在静态初始化块中调用,除非您将输出赋值给变量。

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对象时被调用。(如果在构造函数中放入类似的东西,通常会更清楚,效果大致相同。但是实例初始化器对于不能编写自己的构造函数的匿名类是有用的。

这是因为JVM不知道是应该在加载类时(静态)调用一次这个方法,还是在每次创建对象时(每个实例)调用这个方法。

因此,调用这个静态方法必须在初始化器中完成,无论是静态初始化器还是实例初始化器。

最新更新