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

📅  最后修改于: 2020-03-22 13:14:45             🧑  作者: Mango

在Java程序中,可以在方法,构造函数和初始化块上执行操作。实例初始化块或IIB用于初始化实例变量。IIB在构造函数之前执行。它们每次在创建类的对象时运行。

  • 每当初始化类时,在调用构造函数之前,都会执行初始化块。
  • 它们通常放在大括号内的构造函数上方。
  • 完全没有必要将它们包括在您的类中。
    // Java程序展示实例初始化块(IIB)
    class GfG
    {
        // 实例初始化块
        {
            System.out.println("IIB块");
        }
        // GfG的构造函数
        GfG()
        {
            System.out.println("构造器被调用");
        }
        public static void main(String[] args)
        {
            GfG a = new GfG();
        }
    }

    输出:

    IIB块
    构造器被调用

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

    // Java代码展示多个IIB
    class GfG
    {
        // IIB1
        {
            System.out.println("IIB1");
        }
        // IIB2
        {
            System.out.println("IIB2");
        }
        // 构造函数
        GfG()
        {
            System.out.println("构造器被调用");
        }
        // IIB3
        {
            System.out.println("IIB3");
        }
        // main函数
        public static void main(String[] args)
        {
            GfG a = new GfG();
        }
    }

    输出:

    IIB1
    IIB2
    IIB3
    构造器被调用

具有父类的实例初始化块

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

// Java代码,展示父类IIB
class B
{
    B()
    {
        System.out.println("B构造函数");
    }
    {
        System.out.println("B-IIB");
    }
}
// 子类
class A extends B
{
    A()
    {
        super();
        System.out.println("A构造函数");
    }
    {
        System.out.println("A-IIB");
    }
    // main函数
    public static void main(String[] args)
    {
        A a = new A();
    }
}

输出:

B-IIB
B-构造函数
A-IIB block
A-构造函数

在上面的示例中,当创建类A的对象时,编译器将尝试执行类A的构造函数。但是它会找到super()语句,并首先执行父类构造函数。
重要事项:

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

参考:
Java中的初始化程序块