範例初始化程式塊用於初始化範例資料成員。 它在每次建立類的物件時執行。範例變數的初始化可以是直接的,但是可以在初始化範例初始化塊中的範例變數時執行額外的操作。
什麼是範例初始化塊的使用,我們可以直接分配一個值在範例資料成員? 例如:
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();
}
}
執行上面程式碼得到以下結果 -
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();
}
}
上面程式碼執行結果如下 -
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