我想知道,有什么不同,有什么方法可以初始化静态最终变量?
private static final int i = 100;
或
private static final int i;
static {
i = 100;
}
这两者有什么不同吗?
答案 0 :(得分:11)
如果你只是设置变量,那么两种形式都是等价的(你应该使用前者,因为它更具可读性和简洁性。)
static {}
表单适用于您还需要执行除变量赋值之外的语句的情况。 (有点人为的)例子:
private static final int i;
static {
establishDatabaseConnection();
i = readIntFromDatabase;
closeDatabaseConnection();
}
答案 1 :(得分:2)
静态块的主要原因是能够在初始化中添加一些逻辑,而不是在1行初始化中,例如初始化数组或其他东西。
答案 2 :(得分:1)
是的,通过使用第二种方式,您可以使用try ... catch块并对异常做出反应,与第一种方式一样,无法捕获声明的异常。
在init类的字段和执行的静态块执行时也有区别,但我没有详细信息,请参阅类实例化的语言规范以获取更多信息。
格尔茨, GHAD
答案 3 :(得分:1)
对于原始变量,什么都没有。不同之处可能是初始化不是很简单,或者init方法/构造函数抛出一个已检查的异常 - 那么你需要一个static
块才能处理异常。
答案 4 :(得分:1)
它们是相同的,除了你可以在静态代码块中写多行。
请参阅java的official turorial。
答案 5 :(得分:1)
您也可以使用转发参考初始化
public class ForwardReference {
private static final int i = getValue();
private static final int j = 2;
public static void main(String[] args) {
System.out.println(i);
}
private static int getValue() {
return j*2;
}
}
这里的关键是我们在声明'j'之前从'getValue'获得'j'的值。静态变量按它们出现的顺序初始化。
这将打印正确的'4'
值