一、illegal forward refrence
前天写一个类时遇到一个很眼生的编译错误(问题简化后):
punlic final class constants{
public static int var2 = var1 + 1;
public static int var1 = 1;
}
编译时出错(第2行):
illegal forward refrence
仔细一想,是因为var2引用的var1在var2之后定义,看来在java中定义static变量时应遵循“声明先于使用”的原则。
二、static块
还是上一个类,var1和var2定义成final,值存在一个properties文件中,在使用前必须将值load进来:
system.getproperties().load(new fileinputstream("constants.properties"));
于是将上面的代码放在static块中:
punlic final class constants{
static{
system.getproperties().load(new fileinputstream("constants.properties"));
}
public static final int var2 = system.getproperties().getproperty("var2");
public static final int var1 = system.getproperties().getproperty("var1");
}
但在运行时var1和var2没有被赋值,debug后发现static块根本没有执行。于是顿悟:final变量在编译时便被编译器计算、赋值,因此在运行时没有必要执行static块。