三種初始化數據域的方法: 在構造器中設置值 在聲明中賦值 初始化塊(initialization block) 初始化塊 在一個類的聲明中,可以包含多個代碼塊。只要構造類的對象,這些塊就會被執行。 class Employee { private static int nextId; private ...
三種初始化數據域的方法:
- 在構造器中設置值
- 在聲明中賦值
- 初始化塊(initialization block)
初始化塊
在一個類的聲明中,可以包含多個代碼塊。只要構造類的對象,這些塊就會被執行。
class Employee {
private static int nextId;
private int id;
private String name;
private double salary;
// object initialization block
{
id = nextId;
nextId++;
}
}
在上面這個示例中,無論使用哪個構造器構造對象,id 域都在對象初始化塊中被初始化。首先運行初始化塊,然後才運行構造器的主體部分。
初始化塊這種機制不是必需的,也不常見。通常會直接將初始化代碼放在構造器中。
由於初始化數據域有多種途徑,所以列出構造過程的所有路徑可能相當混亂。下麵是調用構造器的具體處理步驟:
- 所有數據域被初始化為預設值(0、false 或 null)
- 按照在類聲明中出現的次序,依次執行所有域初始化語句和初始化塊
- 如果構造器第一行調用了第二個構造器,則執行第二個構造器主體
- 執行這個構造器的主體
靜態的初始化塊
可以通過提供一個初始化值,或者使用一個靜態的初始化塊來對靜態域進行初始化。
前面已經介紹過第一種機制(提供一個初始化值):private static int nextId = 1;
如果對類的靜態域進行初始化的代碼比較複雜,那麼可以使用靜態的初始化塊。將代碼放在一個塊中,並標記關鍵字 static。下麵是一個示例。其功能是將雇員 ID 的起始值賦予一個小於 10000 的隨機整數。
// static initialization block
static {
Random generator = new Random();
nextId = generator.nextInt(lOOOO);
}
在類第一次載入的時候,將會進行靜態域的初始化。與實例域一樣,除非將它們顯式地設置成其他值,否則預設的初始值是 0、false 或 null。所有的靜態初始化語句以及靜態初始化塊都將依照類定義的順序執行。
參考資料
《Java核心技術捲一:基礎知識》(第10版)第 4 章:對象與類 4.6.7 初始化塊
本文來自博客園,作者:真正的飛魚,轉載請註明原文鏈接:https://www.cnblogs.com/feiyu2/p/17358150.html