實(shí)例初始化程序塊用于初始化實(shí)例數(shù)據(jù)成員。 它在每次創(chuàng)建類(lèi)的對(duì)象時(shí)運(yùn)行。實(shí)例變量的初始化可以是直接的,但是可以在初始化實(shí)例初始化塊中的實(shí)例變量時(shí)執(zhí)行額外的操作。
什么是實(shí)例初始化塊的使用,我們可以直接分配一個(gè)值在實(shí)例數(shù)據(jù)成員? 例如:
class Bike{
int speed=100;
}
假設(shè)在賦值給實(shí)例數(shù)據(jù)成員時(shí)必須要執(zhí)行一些操作。 如:使用for
循環(huán)來(lái)填充復(fù)雜數(shù)組或錯(cuò)誤處理等。
實(shí)例初始化程序塊的示例
下面來(lái)看看實(shí)例初始化塊執(zhí)行初始化的簡(jiǎn)單例子。
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();
}
}
執(zhí)行上面代碼得到以下結(jié)果 -
speed is 100
speed is 100
在Java中有三個(gè)地方可以執(zhí)行實(shí)例初始化塊操作:
實(shí)例初始化塊或構(gòu)造函數(shù)哪個(gè)先調(diào)用?
看看下面代碼就知道了。
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();
}
}
執(zhí)行上面代碼得到以下結(jié)果 -
instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked
在上面的例子中,似乎首先調(diào)用實(shí)例初始化塊,但是可惜不是。 實(shí)例初始化塊在對(duì)象創(chuàng)建時(shí)被調(diào)用。 java編譯器在第一個(gè)語(yǔ)句super()
之后的構(gòu)造函數(shù)中復(fù)制實(shí)例初始化塊。 首先,調(diào)用構(gòu)造函數(shù)。 讓我們通過(guò)下面的圖來(lái)理解它:
注意:java編譯器在每個(gè)構(gòu)造函數(shù)中會(huì)自動(dòng)復(fù)制實(shí)例初始化塊的代碼。
實(shí)例初始化塊的規(guī)則:
實(shí)例初始化塊主要有三個(gè)規(guī)則。 它們?nèi)缦拢?/p>
super()
構(gòu)造函數(shù)調(diào)用之后)調(diào)用實(shí)例初始化塊。在super()
之后調(diào)用的實(shí)例初始化塊的程序示例:
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();
}
}
上面代碼執(zhí)行結(jié)果如下 -
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
實(shí)例塊的另一個(gè)示例
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);
}
}
上面代碼執(zhí)行結(jié)果如下 -
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