Java 简明教程

Java - Instance Initializer Block

Java Instance Initializer Block

*instance initializer block*是在 class 中声明的代码块,用于初始化实例 data members。实例初始化器块对每个对象执行一次,可用于设置实例变量的初始值。

instance initializer block 类似于 Java constructor,但其执行和用途不同。

Java Instance Initializer Block Example

这个例子演示了 Java 中的示例初始化程序块:

public class Tester {
   public int a;
   { a = 10; }
}

Characteristics of Instance Initializer Block

  1. 一旦创建一个对象,就调用实例初始化程序块。

  2. 在调用对象的任何构造函数之前,调用实例初始化程序块。

  3. 如果在子类的情况下,在调用超类构造函数后,将调用实例初始化程序块。

  4. 实例初始化程序块可用于执行多个语句。

  5. 实例初始化程序块通常用于实例化多个值字段,例如数组。

Use of Instance Initializer Block

以下列出 Java 中实例初始化程序块的用途:

  1. 要初始化实例变量。

  2. 初始化代码中使用的资源。

  3. 执行实例变量的动态初始化。

  4. 使用多个构造函数的通用初始化逻辑。

Java Instance Initializer Block: More Examples

Example 1: Demonstrating What Invokes First, Instance Initializer Block or Constructor

在此示例中,我们展示了在对象构造函数之前执行实例初始化程序块。当使用 new 运算符创建对象时,将调用实例初始化程序块和构造函数。

package com.tutorialspoint;
public class Tester {
   {
      System.out.println("Inside instance initializer block");
   }

   Tester(){
      System.out.println("Inside constructor");
   }

   public static void main(String[] arguments) {
      Tester test = new Tester();
   }
}
60
150

Example 2: Demonstrating Whether Constructor Overrides Instance Initializer Block

在此示例中,我们展示了实例初始化程序块中初始化的值被对象构造函数重写。当使用 new 运算符创建对象时,将调用实例初始化程序块和构造函数。

package com.tutorialspoint;
public class Tester {
   int a;
   {
      System.out.println("Inside instance initializer block");
      a = 10;
   }

   Tester(){
      System.out.println("Inside constructor");
      a = 20;
   }

   public static void main(String[] arguments) {
      Tester test = new Tester();
      System.out.println("Value of a: " + a);
   }
}
Inside instance initializer block
Inside constructor
Value of a: 20

Example 3: Instance Initializer Block and Super Constructor

在此示例中,我们展示了在子实例初始化程序块之前调用超类构造函数。我们创建了一个 SuperTester 类,而 Tester 类扩展了此类。在 main() 方法中,我们将打印实例变量的值。在输出中,可以验证调用的块的顺序。首先调用超类构造函数。然后调用子实例初始化器,该初始化器初始化实例变量,然后调用子类的构造函数。

package com.tutorialspoint;
class SuperTester{
   SuperTester(){
      System.out.println("Inside super constructor");
   }
}

public class Tester extends SuperTester {
   int a;
   {
      System.out.println("Inside instance initializer block");
      a = 10;
   }

   Tester(){
      System.out.println("Inside constructor");
   }

   public static void main(String[] arguments) {
      Tester test = new Tester();
      System.out.println("Value of a: " + test.a);
   }
}
Inside super constructor
Inside instance initializer block
Inside constructor
Value of a: 10