为什么在类定义中调用的静态方法必须在静态初始化块中调用,除非您将输出赋值给变量。
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不知道是应该在加载类时(静态)调用一次这个方法,还是在每次创建对象时(每个实例)调用这个方法。
因此,调用这个静态方法必须在初始化器中完成,无论是静态初始化器还是实例初始化器。