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

Java 关于何时可以在类定义中调用静态方法的约束背后的推理,java,static,static-methods,static-members,initializer,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. } p

如果在类定义中调用静态方法,为什么必须在静态初始值设定项块中调用该方法,除非将输出分配给变量

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不知道在加载类时是否应调用此方法一次(静态),或者每次创建对象时(每个实例)


因此,调用此静态方法必须在初始值设定项中完成,无论是静态初始值设定项还是实例初始值设定项。

因为如果不为方法提供某种上下文来调用它,则无法调用该方法,无论它是变量赋值、初始值设定项块、另一个方法还是构造函数,这与静态方法无关。最后,答案很简单,“因为这是Java语法的规则。”另一种语言可能会有不同的做法。这不是另一种语言。能够调用方法来初始化
静态
或构造函数之外的变量是一种编译器swizzle。实际上,该方法是在
static
或constructor方法中调用的。你能展示一下你提到的匿名类吗?@skiwi Flanagan在他的Java中有一个简单的例子,但我手边没有这本书。我一直在网上寻找一个很好的例子——也许?我想我个人从来没有用过它。