我的问题是关于 static 关键字的一种特殊用法。可以使用 static
关键字来覆盖不属于任何函数的类中的代码块。例如下面的代码编译:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
如果删除 static
关键字,它会抱怨,因为变量 a
是 final
。但是,可以删除 final
和 static
关键字并使其编译。
这两种方式都让我感到困惑。我怎么会有一个不属于任何方法的代码段?怎么可能调用它?一般来说,这种用法的目的是什么?或者更好的是,我在哪里可以找到有关此的文档?
原文由 Szere Dyeri 发布,翻译遵循 CC BY-SA 4.0 许可协议
带有 static 修饰符的代码块表示 类 初始化器;如果没有 static 修饰符,代码块是一个 实例 初始化器。
当类被加载时(实际上,当它被解析时,类初始化器按照它们被定义的顺序执行(自上而下,就像简单的变量初始化器一样)(实际上,当它被解析时,但这是一个技术问题)。
实例初始化器按照类被实例化时定义的顺序执行,紧接在执行构造函数代码之前,紧接在调用超级构造函数之后。
如果从 --- 中删除
static
int a
,它就会变成一个实例变量,您无法从静态初始化程序块访问它。这将无法编译并出现错误“无法从静态上下文中引用非静态变量 a”。如果您还从初始化程序块中删除了
static
,它将成为一个实例初始化程序,因此int a
在构造时被初始化。