Java 面向对象
在Java程序中,可以在方法,构造函数和初始化块上执行操作。实例初始化块或IIB用于初始化实例变量。IIB在构造函数之前执行。每次创建类的对象时,它们都会运行。
初始化块在类初始化和构造函数被调用之前执行。
它们通常放置在大括号内的构造函数之上。
将它们包含在你的class中是没有必要的。
// 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();
}
}
输出:
IIB block
Constructor Called
程序中初始化块的多实例
我们也可以在一个班级中有多个IIB。如果编译器找到多个IIB,那么它们都从上到下执行,即首先写入的IIB将首先执行。
// 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 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()语句并首先进入父类构造函数来执行。这种情况下的执行顺序如下:
I. Instance Initialization Block of super class
II. Constructors of super class
III. Instance Initialization Blocks of the class
IV. Constructors of the class
重要的一点:
每次创建新实例时都会运行实例初始化块。
初始化块按它们在程序中出现的顺序运行
在调用父类构造函数之后调用实例初始化块(即在调用super()构造函数之后)