Initializing Fields

如您所见,通常可以在其声明中为字段提供初始值:

public class BedAndBreakfast {

    // initialize to 10
    public static int capacity = 10;

    // initialize to false
    private boolean full = false;
}

当初始化值可用并且初始化可以放在一行上时,这很好地工作。但是,这种初始化形式由于其简单性而受到限制。如果初始化需要某种逻辑(例如,错误处理或填充复杂数组的for循环),则简单分配是不够的。实例变量可以在构造函数中初始化,可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java 编程语言包括静态初始化块。

Note:

尽管这是最常见的做法,但不必在类定义的开头声明字段。只需要在使用它们之前对其进行声明和初始化。

静态初始化块

静态初始化块是用括号{ }括起来并以static关键字开头的普通代码块。这是一个例子:

static {
    // whatever code is needed for initialization goes here
}

一个类可以具有任意数量的静态初始化块,并且它们可以出现在类主体中的任何位置。运行时系统保证按其在源代码中出现的 Sequences 调用静态初始化块。

静态块有另一种选择-您可以编写私有的静态方法:

class Whatever {
    public static varType myVar = initializeClassVariable();
        
    private static varType initializeClassVariable() {

        // initialization code goes here
    }
}

私有静态方法的优点是,如果需要重新初始化类变量,则可以在以后重用它们。

初始化实例成员

通常,您需要将代码放在构造函数中以初始化实例变量。使用构造函数初始化实例变量有两种选择:初始化块和 final 方法。

实例变量的初始化程序块看起来像静态初始化程序块,但没有static关键字:

{
    // whatever code is needed for initialization goes here
}

Java 编译器将初始化程序块复制到每个构造函数中。因此,该方法可用于在多个构造函数之间共享代码块。

final方法不能在子类中覆盖。有关interface和继承的类将对此进行讨论。这是使用 final 方法初始化实例变量的示例:

class Whatever {
    private varType myVar = initializeInstanceVariable();
        
    protected final varType initializeInstanceVariable() {

        // initialization code goes here
    }
}

如果子类可能想重用初始化方法,则此功能特别有用。该方法是final方法,因为在实例初始化期间调用非final方法可能会导致问题。