2010-07-02 129 views
3

我想知道,有什么不同,在初始化静态最终变量的各种方法?初始化静态最终变量

private static final int i = 100; 

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

有两个之间有什么不同?

回答

11

如果你只设置变量,这两种形式是等价的(你应该使用前者,因为它是更具可读性和简洁)。

如果您还需要执行变量赋值以外的语句,则存在static {}格式。 (有点做作)例如:

private static final int i; 
static { 
    establishDatabaseConnection(); 
    i = readIntFromDatabase; 
    closeDatabaseConnection(); 
} 
1

是的,通过使用第二种方法,您可以使用try ... catch块并对异常做出反应,因为第一种方式声明的异常无法捕捉。

在init类中执行字段和执行静态块时也有区别,但我没有详细信息,请参阅有关类实例化的语言规范以获取更多信息。

格尔茨, GHAD

1

对于原始变量,什么都没有。不同之处在于,如果初始化不是微不足道的,或者init方法/构造函数抛出一个检查异常 - 那么您需要一个static块才能处理异常。

2

静态块的主要原因是能够添加一些逻辑到初始化,你不能在1行初始化,如初始化一个数组或类似的东西。

1

它们是相同的,除了你可以在静态代码块中写入多行。

查看java的official turorial

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'

+0

这太棒了。 但是,我将“j = 2”改为“j = j()”,并添加了“static int j(){return 2;}”。通过这些更改,ForwardReference打印“0”。所以似乎对前向参考有一些限制。 – emory 2010-07-03 21:51:46