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

时间:2014-03-21 20:48:38

标签: java static static-methods static-members initializer

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

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不知道在加载类时,或者每次创建对象时是否应该调用此方法。

2 个答案:

答案 0 :(得分:2)

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

public class MyClass {

  staticFunction(); // Not allowed!

  {
    staticFunction(); // Allowed.
  }

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

每次创建新的MyClass对象时都会调用实例初始值设定项。 (如果你在构造函数中放置类似的东西通常会更清楚,它具有大致相同的效果。但是实例初始化器对于无法编写自己的构造函数的匿名类很有用。)

答案 1 :(得分:0)

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

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