我想知道,有什么不同,在初始化静态最终变量的各种方法?初始化静态最终变量
private static final int i = 100;
或
private static final int i;
static {
i = 100;
}
有两个之间有什么不同?
我想知道,有什么不同,在初始化静态最终变量的各种方法?初始化静态最终变量
private static final int i = 100;
或
private static final int i;
static {
i = 100;
}
有两个之间有什么不同?
如果你只设置变量,这两种形式是等价的(你应该使用前者,因为它是更具可读性和简洁)。
如果您还需要执行变量赋值以外的语句,则存在static {}
格式。 (有点做作)例如:
private static final int i;
static {
establishDatabaseConnection();
i = readIntFromDatabase;
closeDatabaseConnection();
}
是的,通过使用第二种方法,您可以使用try ... catch块并对异常做出反应,因为第一种方式声明的异常无法捕捉。
在init类中执行字段和执行静态块时也有区别,但我没有详细信息,请参阅有关类实例化的语言规范以获取更多信息。
格尔茨, GHAD
对于原始变量,什么都没有。不同之处在于,如果初始化不是微不足道的,或者init方法/构造函数抛出一个检查异常 - 那么您需要一个static
块才能处理异常。
静态块的主要原因是能够添加一些逻辑到初始化,你不能在1行初始化,如初始化一个数组或类似的东西。
它们是相同的,除了你可以在静态代码块中写入多行。
查看java的official turorial。
你也可以使用正向参考初始化
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'
这太棒了。 但是,我将“j = 2”改为“j = j()”,并添加了“static int j(){return 2;}”。通过这些更改,ForwardReference打印“0”。所以似乎对前向参考有一些限制。 – emory 2010-07-03 21:51:46