實(shí)例初始化塊用于初始化類的對象。一個實(shí)例初始化程序只是一個類的代碼塊,但在任何方法或構(gòu)造函數(shù)之外。實(shí)例初始值設(shè)定程序沒有名稱。它的代碼只是放置在一個開放的大括號和閉包中。
下面的代碼展示了如何為Test
類聲明一個實(shí)例初始化器。注意,實(shí)例初始化程序在實(shí)例上下文中執(zhí)行,并且關(guān)鍵字this
在實(shí)例初始化程序中可用。
class Test {
private int num;
// An instance initializer
{
this.num = 101;
/* Other code for the instance initializer*/
}
/* Other code for Test class*/
}
一個類可以有多個實(shí)例初始化器。對于創(chuàng)建的每個對象,它們都以文本順序自動執(zhí)行。所有實(shí)例初始值的代碼在任何構(gòu)造函數(shù)之前執(zhí)行。
下面的代碼演示了構(gòu)造函數(shù)和實(shí)例初始化函數(shù)的執(zhí)行順序。
public class Main {
{
System.out.println("Inside instance initializer 1.");
}
{
System.out.println("Inside instance initializer 2.");
}
public Main() {
System.out.println("Inside no-args constructor.");
}
public static void main(String[] args) {
Main m = new Main();
}
}
上面的代碼生成以下結(jié)果。
Inside instance initializer 1.
Inside instance initializer 2.
Inside no-args constructor.
實(shí)例初始化程序中不能有return
語句。
靜態(tài)初始化塊也稱為靜態(tài)初始化器。它類似于實(shí)例初始化塊。
它用于初始化一個類。 每個對象執(zhí)行一個實(shí)例初始化器,而當(dāng)類定義被加載到JVM中時,只對一個類執(zhí)行一次靜態(tài)初始化器。需要在其聲明的開頭使用static
關(guān)鍵字。
在一個類中可以有多個靜態(tài)初始化器。 所有靜態(tài)初始化器都按文本出現(xiàn)的順序執(zhí)行,并在任何實(shí)例初始化器之前執(zhí)行。
以下代碼演示了何時執(zhí)行靜態(tài)初始化程序。
public class Main {
private static int num;
{// An instance initializer
System.out.println("Inside instance initializer.");
}
// A static initializer. Note the use of the keyword static below.
static {
num = 2018;
System.out.println("Inside static initializer.");
}
// Constructor
public Main() {
System.out.println("Inside constructor.");
}
public static void main(String[] args) {
System.out.println("Inside main() #1. num: " + num);
// Declare a reference variable of the class
Main si;
System.out.println("Inside main() #2. num: " + num);
new Main(); // Create an object
System.out.println("Inside main() #3. num: " + num);
new Main();// Create another object
}
}
上面的代碼生成以下結(jié)果。
Inside static initializer.
Inside main() #1. num: 2018
Inside main() #2. num: 2018
Inside instance initializer.
Inside constructor.
Inside main() #3. num: 2018
Inside instance initializer.
Inside constructor.