在构造函数中初始化静态最终字段
2022-08-31 11:20:03
public class A
{
private static final int x;
public A()
{
x = 5;
}
}
-
final
意味着变量只能赋值一次(在构造函数中)。 -
static
表示它是一个类实例。
我不明白为什么这是被禁止的。这些关键字在哪里相互干扰?
public class A
{
private static final int x;
public A()
{
x = 5;
}
}
final
意味着变量只能赋值一次(在构造函数中)。static
表示它是一个类实例。我不明白为什么这是被禁止的。这些关键字在哪里相互干扰?
每次创建类的实例时,都会调用构造函数。因此,上面的代码意味着每次创建实例时都会重新初始化 x 的值。但是由于变量被声明为 final(和 static),因此您只能执行此操作
class A {
private static final int x;
static {
x = 5;
}
}
但是,如果您删除静态,则可以执行以下操作:
class A {
private final int x;
public A() {
x = 5;
}
}
或者这个:
class A {
private final int x;
{
x = 5;
}
}
加载类时初始化静态最终变量。构造函数可能在很久以后才被调用,或者根本不调用。此外,构造函数将被多次调用(每个新对象),因此该字段不再是最终的。
如果您需要自定义逻辑来初始化静态最终字段,请将其放在静态块中