我正在尝试在Java中初始化不同类型的变量。我可以在构造函数中初始化final变量(例如final int b)和静态变量(例如static int c),但我不能在构造函数中初始化静态final变量(例如static final int d)。 IDE还会显示错误消息。
为什么Java不允许在构造函数中初始化静态最终变量?
public class InitialisingFields {
int a;
final int b;
static int c;
static final int d;
InitialisingFields(){
a = 1;
b = 2;
c = 3;
d = 4;
}
public static void main(String[] args) {
InitialisingFields i = new InitialisingFields();
}
}
错误讯息:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot assign a value to final variable d
at JTO.InitialisingFields.<init>(InitialisingFields.java:22)
at JTO.InitialisingFields.main(InitialisingFields.java:26)
Java Result: 1
答案 0 :(得分:6)
静态变量由类的所有实例共享,因此每次创建类的实例时,将再次分配相同的变量。由于它是最终的,因此只能分配一次。因此不允许。
static final
变量应保证只分配一次。因此,可以在声明它们的同一表达式中指定它们,也可以在静态初始化程序块中指定它们,该块仅执行一次。
答案 1 :(得分:3)
由于
您可以在初始化之前读取静态最终变量,其值将是该类型的默认值,例如
class Nasty {
static final int foo = yuk();
static final int bar = 1;
static int yuk() {
System.out.println(bar); // prints 0.
return 99;
}
}
然而,这是一个奇怪的案例,几乎肯定不是所期望的。
答案 2 :(得分:0)
您无法重新分配final
字段。最终意味着变量无法更改。删除最后,你没事。