📜  Java实例初始化

📅  最后修改于: 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中有三个地方可以执行操作:

  • 方法
  • 构造函数
  • Block
"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编译器在每个构造函数中复制实例初始化程序块的代码。

实例初始化程序块的规则:

实例初始化块主要有三条规则。它们如下

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

在super()之后调用的实例初始化程序块的程序

"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);  
}  
}