範例初始化塊用於初始化類的物件。一個範例初始化程式只是一個類的程式碼塊,但在任何方法或建構函式之外。範例初始值設定程式沒有名稱。它的程式碼只是放置在一個開放的大括號和閉包中。
下面的程式碼展示了如何為Test
類宣告一個範例初始化器。注意,範例初始化程式在範例上下文中執行,並且關鍵字this
在範例初始化程式中可用。
class Test {
private int num;
// An instance initializer
{
this.num = 101;
/* Other code for the instance initializer*/
}
/* Other code for Test class*/
}
一個類可以有多個範例初始化器。對於建立的每個物件,它們都以文字順序自動執行。所有範例初始值的程式碼在任何建構函式之前執行。
下面的程式碼演示了建構函式和範例初始化函式的執行順序。
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();
}
}
上面的程式碼生成以下結果。
Inside instance initializer 1.
Inside instance initializer 2.
Inside no-args constructor.
範例初始化程式中不能有return
語句。
靜態初始化塊也稱為靜態初始化器。它類似於範例初始化塊。
它用於初始化一個類。 每個物件執行一個範例初始化器,而當類定義被載入到JVM中時,只對一個類執行一次靜態初始化器。需要在其宣告的開頭使用static
關鍵字。
在一個類中可以有多個靜態初始化器。 所有靜態初始化器都按文字出現的順序執行,並在任何範例初始化器之前執行。
以下程式碼演示了何時執行靜態初始化程式。
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
}
}
上面的程式碼生成以下結果。
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.