此Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发行说明。
正如你所见,你可以在声明字段时为其提供一个初始值:
public class BedAndBreakfast { // 初始化为10 public static int capacity = 10; // 初始化为false private boolean full = false; }
当初始化值可用且初始化可以放在一行时,这种方式很好用。然而,由于其简单性,这种初始化方式有一些限制。如果初始化需要一些逻辑(例如错误处理或用于填充复杂数组的for循环),简单的赋值是不足够的。实例变量可以在构造函数中初始化,可以在其中使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java编程语言包括了静态初始化块。
一个静态初始化块是一段常规的代码块,用花括号{ }
括起来,并且前面带有static
关键字。以下是一个示例:
static { // 初始化所需的代码放在这里 }
一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证静态初始化块按照它们在源代码中出现的顺序被调用。
静态块还有一种替代方法——你可以编写一个私有的静态方法:
class Whatever { public static varType myVar = initializeClassVariable(); private static varType initializeClassVariable() { // 初始化代码放在这里 } }
私有静态方法的优点是,如果你需要重新初始化类变量,它们可以在以后被重用。
通常情况下,你会在构造函数中放置代码来初始化实例变量。使用构造函数来初始化实例变量有两种替代方法:初始化块和final方法。
用于实例变量的初始化块看起来和静态初始化块一样,但没有static
关键字:
{ // 初始化所需的代码放在这里 }
Java编译器会将初始化块复制到每个构造函数中。因此,这种方法可以在多个构造函数之间共享一段代码块。
final方法在子类中无法被覆盖。这在接口和继承的课程中有讨论。以下是使用final方法来初始化实例变量的示例:
class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // 初始化代码放在这里 } }
如果子类可能想要重用初始化方法,这种方法尤其有用。该方法是final的,因为在实例初始化期间调用非final方法可能会引发问题。