我的问题是关于 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
关键字并使其编译。
这两个方面都让我感到困惑。我怎么会有一个不属于任何方法的代码部分?怎么可能调用它?一般来说,这种用法的目的是什么?或者更好的是,我在哪里可以找到有关此内容的文档?
最佳答案
带有 static 修饰符的代码块表示一个类初始化器;如果没有 static 修饰符,代码块是一个实例初始值设定项。
类初始化器在类加载时(实际上是在解析时,但这是一个技术细节)按照定义的顺序执行(自上而下,就像简单的变量初始化器一样)。
实例初始值设定项按照类实例化时定义的顺序执行,紧接着执行构造函数代码之前,紧接着调用 super 构造函数之后。
如果从 int a
中删除 static
,它就会变成一个实例变量,您无法从静态初始化 block 访问该变量。这将无法编译,并出现错误“无法从静态上下文引用非静态变量 a”。
如果您还从初始化程序 block 中删除 static
,那么它就会成为实例初始化程序,因此 int a
在构造时被初始化。
关于java - 静态和非静态初始化代码块有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60684649/