初始化静态最终变量

时间:2010-07-02 12:59:08

标签: java

我想知道,有什么不同,有什么方法可以初始化静态最终变量?

private static final int i = 100;

private static final int i;
static {
    i = 100;
}

这两者有什么不同吗?

6 个答案:

答案 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'