原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/30/2796666.html
正如你看到的,我们经常在字段的声明中提供一个初始化值:
public class BedAndBreakfast { // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false; }
当初始化的值是可用的,初始化语句也放在一行,上面的代码就可以工作。但是这种形式的初始化由于比较简单,所以有一些限制。如果初始化需要一些逻辑处理(例如,错误处理或者是通过循环填充一个复杂的数组),简单的赋值是不足的。实例变量可以在构造方法初始化,并做错误处理和逻辑处理。为了给类变量提供一样的功能,java程序语言包含了静态初始块。
注意:尽管在类声明的开始时,声明字段是最常用的实践,但是它非必须。只有它在使用前必须声明和初始化才是必须的。
静态初始块
一个静态初始化代码块,就像平常的代码块,使用大括号{}闭合,前面有一个static关键字,这里是例子:
static { // whatever code is needed for initialization goes here }
一个类可以有任意数量的静态初始块,并可以出现在类体的任意位置。运行系统保证静态初始块的调用顺序和在源代码的出现顺序是一致的。
这里是一个替代代码块的方法—可以写一个私有的static方法:
class Whatever { public static varType myVar = initializeClassVariable(); private static varType initializeClassVariable() { // initialization code goes here } }
私有static方法的优点是,它可以在你需要重新初始化变量时被重用。
实例化实例成员
一般来说,你会把变量的初始化代码放在构造方法里。这里有两个可选的使用构造方法初始化实例变量的方法:初始化代码块和final方法。
实例变量的初始化代码块和static初始化代码块差不多,但是没有static关键字:
{ // whatever code is needed for initialization goes here }
java编译器会把初始化代码块拷贝到每个构造方法。所以,这种方式可以用来在多个构造方法中共享代码块。
一个final方法不能被子类覆盖。这个会在接口和继承的章节讨论。这里有一个例子,使用final方法初始化实例变量:
class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // initialization code goes here } }
如果子类要重用初始化代码,这是特别有用的。初始化代码设置为final,这个是因为在实例初始化时,调用非final方法会造成问题。