Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
如你所见,你通常可以在其声明中为字段提供初始值:
public class BedAndBreakfast { // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false; }
当初始化值可用并且初始化可以放在一行上时,这很有效。然而,这种形式的初始化由于其简单性而具有局限性。如果初始化需要一些逻辑(例如,错误处理或 for
循环来填充复杂数组),则简单的赋值是不合适的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java 编程语言包括 static initialization blocks (静态初始化块)。
一个 静态初始化块 是大括号 { }
内的一个普通代码块,前面有 static
关键字。这里是一个例子:
static { // whatever code is needed for initialization goes here }
一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证按照它们在源代码中出现的顺序调用静态初始化块。
还有静态块的替代方案 你可以编写一个私有静态方法:
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 method。这在接口和继承的课程中讨论。以下是使用 final 方法初始化实例变量的示例:
class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // initialization code goes here } }
如果子类可能想要重用初始化方法,这尤其有用。该方法是 final 的,因为在实例初始化期间调用非 final 方法可能会导致问题。