Java初始化塊
實例初始化塊
實例初始化塊用於初始化類的對象。一個實例初始化程序只是一個類的代碼塊,但在任何方法或構造函數之外。實例初始值設定程序沒有名稱。它的代碼只是放置在一個開放的大括號和閉包中。
示例
下面的代碼展示瞭如何爲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.