本文概述
实例初始化块用于初始化实例数据成员。它在每次创建类的对象时运行。
实例变量的初始化可以直接完成,但是在实例初始化块中初始化实例变量时可以执行额外的操作。
问)的使用实例初始化块当我们可以直接在实例数据成员赋值吗?例如:
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();
}
}
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();
}
}
Output: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);
}
}
Output: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
评论前必须登录!
注册