📜  Java中的实例初始化块 (IIB)

📅  最后修改于: 2022-05-13 01:54:22.771000             🧑  作者: Mango

Java中的实例初始化块 (IIB)

在Java程序中,可以对方法、构造函数和初始化块执行操作。实例初始化块或 IIB 用于初始化实例变量。因此,首先调用构造函数, Java编译器在第一条语句 super() 之后复制构造函数中的实例初始化程序块。每次创建类的对象时它们都会运行。

  • 每当初始化类并且在调用构造函数之前执行初始化块。
  • 它们通常放置在大括号内的构造函数上方。
  • 完全没有必要将它们包含在您的课程中。
Java
// Java program to illustrate
// Instance Initialization Block
class GfG {
    // Instance Initialization Block
    {
        System.out.println("IIB block");
    }
 
    // Constructor of GfG class
    GfG() { System.out.println("Constructor Called"); }
    public static void main(String[] args)
    {
        GfG a = new GfG();
    }
}


Java
// Java program to illustrate
// execution of multiple
// Instance Initialization Blocks
// in one program
class GfG {
    // Instance Initialization Block - 1
    {
        System.out.println("IIB1 block");
    }
 
    // Instance Initialization Block - 2
    {
        System.out.println("IIB2 block");
    }
 
    // Constructor of class GfG
    GfG() { System.out.println("Constructor Called"); }
 
    // Instance Initialization Block - 3
    {
        System.out.println("IIB3 block");
    }
 
    // main function
    public static void main(String[] args)
    {
        GfG a = new GfG();
    }
}


Java
// Java program to illustrate
// Instance Initialization Block
// with super()
 
// Parent Class
class B {
    B() { System.out.println("B-Constructor Called"); }
 
    {
        System.out.println("B-IIB block");
    }
}
 
// Child class
class A extends B {
    A()
    {
        super();
        System.out.println("A-Constructor Called");
    }
    {
        System.out.println("A-IIB block");
    }
 
    // main function
    public static void main(String[] args)
    {
        A a = new A();
    }
}


输出
IIB block
Constructor Called

程序中的多个实例初始化块

我们也可以在一个类中有多个 IIB。如果编译器找到多个IIB,那么它们都从上到下执行,即写在顶部的IIB将首先执行。

Java

// Java program to illustrate
// execution of multiple
// Instance Initialization Blocks
// in one program
class GfG {
    // Instance Initialization Block - 1
    {
        System.out.println("IIB1 block");
    }
 
    // Instance Initialization Block - 2
    {
        System.out.println("IIB2 block");
    }
 
    // Constructor of class GfG
    GfG() { System.out.println("Constructor Called"); }
 
    // Instance Initialization Block - 3
    {
        System.out.println("IIB3 block");
    }
 
    // main function
    public static void main(String[] args)
    {
        GfG a = new GfG();
    }
}
输出
IIB1 block
IIB2 block
IIB3 block
Constructor Called

具有父类的实例初始化块

您也可以在父类中拥有 IIB。实例初始化块代码在构造函数中调用 super() 后立即运行。编译器在执行当前类的 IIB 之前执行父类的 IIB。

看看下面的例子。

Java

// Java program to illustrate
// Instance Initialization Block
// with super()
 
// Parent Class
class B {
    B() { System.out.println("B-Constructor Called"); }
 
    {
        System.out.println("B-IIB block");
    }
}
 
// Child class
class A extends B {
    A()
    {
        super();
        System.out.println("A-Constructor Called");
    }
    {
        System.out.println("A-IIB block");
    }
 
    // main function
    public static void main(String[] args)
    {
        A a = new A();
    }
}
输出
B-IIB block
B-Constructor Called
A-IIB block
A-Constructor Called

在上面的例子中,当创建类 A 的对象时,编译器尝试执行类 A 的构造函数。但是它找到了 super() 语句并首先去父类构造函数执行。在这种情况下,执行顺序如下:

  1. 超类的实例初始化块。
  2. 超类的构造函数。
  3. 类的实例初始化块。
  4. 类的构造函数。

要点:

  • 每次创建新实例时都会运行实例初始化块。
  • 初始化块按照它们在程序中出现的顺序运行
  • 实例初始化块在调用父类构造函数之后调用(即在 super() 构造函数调用之后)