📅  最后修改于: 2020-09-24 03:47:07             🧑  作者: Mango
实例初始化器块用于初始化实例数据成员。每当创建类的对象时,它就会运行。
可以直接完成实例变量的初始化,但是可以在实例初始化程序块中初始化实例变量时执行额外的操作。
"class Bike{
int speed=100;
}
假设我必须在给实例数据成员赋值的时候执行一些操作,例如:for循环来填充一个复杂的数组或者错误处理等等。
让我们看看执行初始化的实例初始化块的简单示例。
"class Bike7{
int speed;
Bike7(){System.out.println("speed is "+speed);}
{speed=100;}
public static void main(String args[]){
Bike7 b1=new Bike7();
Bike7 b2=new Bike7();
}
}
在java中有三个地方可以执行操作:
"class Bike8{
int speed;
Bike8(){System.out.println("constructor is invoked");}
{System.out.println("instance initializer block invoked");}
public static void main(String args[]){
Bike8 b1=new Bike8();
Bike8 b2=new Bike8();
}
}
在上面的示例中,似乎首先调用了实例初始化块,但没有。在创建对象时调用实例intializer块。java编译器在构造函数的第一个语句super()之后复制实例初始化块。首先调用构造函数。让我们通过下图来理解它
注意:Java编译器在每个构造函数中复制实例初始化程序块的代码。
实例初始化块主要有三条规则。它们如下
"class A{
A(){
System.out.println("parent class constructor invoked");
}
}
class B2 extends A{
B2(){
super();
System.out.println("child class constructor invoked");
}
{System.out.println("instance initializer block is invoked");}
public static void main(String args[]){
B2 b=new B2();
}
}
"class A{
A(){
System.out.println("parent class constructor invoked");
}
}
class B3 extends A{
B3(){
super();
System.out.println("child class constructor invoked");
}
B3(int a){
super();
System.out.println("child class constructor invoked "+a);
}
{System.out.println("instance initializer block is invoked");}
public static void main(String args[]){
B3 b1=new B3();
B3 b2=new B3(10);
}
}