据我了解,如果不能在一行中完成,则“静态初始化块”用于设置静态字段的值。
但我不明白为什么我们需要一个特殊的块。例如,我们将一个字段声明为静态的(没有赋值)。然后编写几行代码,为上面声明的静态字段生成并赋值。
为什么我们需要将这些行放在一个特殊的块中,例如: static {...}
?
原文由 Roman 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果它们不在静态初始化块中,它们会在哪里?您将如何声明一个仅用于初始化目的的局部变量,并将其与字段区分开来?例如, 您 想如何编写:
public class Foo {
private static final int widgets;
static {
int first = Widgets.getFirstCount();
int second = Widgets.getSecondCount();
// Imagine more complex logic here which really used first/second
widgets = first + second;
}
}
如果 first
和 second
不在一个块中,它们看起来像字段。如果它们在前面没有 static
的块中,那将算作实例初始化块而不是静态初始化块,因此 每个 构造的实例将执行一次而不是总共执行一次。
现在在这种特殊情况下,您可以改用静态方法:
public class Foo {
private static final int widgets = getWidgets();
static int getWidgets() {
int first = Widgets.getFirstCount();
int second = Widgets.getSecondCount();
// Imagine more complex logic here which really used first/second
return first + second;
}
}
…但是当您希望在同一个块中分配多个变量时,这不起作用,或者没有(例如,如果您只想记录一些东西 - 或者可能初始化本机库)。
原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
非静态块:
每次 构造类的实例时调用。 静态块 只被调用 一次,当类本身被初始化时,不管你创建了多少该类型的对象。
例子:
这打印: