初始化字段

原文: https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

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

  1. public class BedAndBreakfast {
  2. // initialize to 10
  3. public static int capacity = 10;
  4. // initialize to false
  5. private boolean full = false;
  6. }

当初始化值可用并且初始化可以放在一行上时,这很有效。然而,这种形式的初始化由于其简单性而具有局限性。如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂数组),则简单的赋值是不合适的。实例变量可以在构造器中初始化,其中可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java 编程语言包括静态初始化块


Note: It is not necessary to declare fields at the beginning of the class definition, although this is the most common practice. It is only necessary that they be declared and initialized before they are used.


静态初始化块

静态初始化块是用大括号{ }括起来的正常代码块,前面是static关键字。这是一个例子:

  1. static {
  2. // whatever code is needed for initialization goes here
  3. }

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

静态块有一个替代方法 - 您可以编写一个私有静态方法:

  1. class Whatever {
  2. public static varType myVar = initializeClassVariable();
  3. private static varType initializeClassVariable() {
  4. // initialization code goes here
  5. }
  6. }

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

初始化实例成员

通常,您可以使用代码在构造器中初始化实例变量。使用构造器初始化实例变量有两种选择:初始化块和最终方法。

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

  1. {
  2. // whatever code is needed for initialization goes here
  3. }

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

最终方法不能在子类中重写。这在接口和继承的课程中讨论。以下是使用 final 方法初始化实例变量的示例:

  1. class Whatever {
  2. private varType myVar = initializeInstanceVariable();
  3. protected final varType initializeInstanceVariable() {
  4. // initialization code goes here
  5. }
  6. }

如果子类可能希望重用初始化方法,这尤其有用。该方法是最终的,因为在实例初始化期间调用非 final 方法可能会导致问题。