Java Instance初始化
为什么使用Instance初始化程序块?
假设我必须在将值赋给实例数据成员时执行一些操作,例如for循环以填充复杂的数组或错误处理等。
Instance初始化程序块的示例
让我们看一下执行初始化的实例初始化程序块的简单示例。
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();
}
}
Output:speed is 100 speed is 100
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();
}
}
instance initializer block invoked constructor is invoked instance initializer block invoked constructor is invoked
在上面的示例中,似乎首先调用了实例初始化程序块,但没有。创建对象时将调用实例初始化器块。 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();
}
}
Output:parent class constructor invoked instance initializer block is invoked child class constructor invoked
实例块的另一个示例
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);
}
}
parent class constructor invoked instance initializer block is invoked child class constructor invoked parent class constructor invoked instance initializer block is invoked child class constructor invoked 10