三種初始化資料域的方法:
- 在構造器中設定值
- 在宣告中賦值
- 初始化塊(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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551420.html
標籤:Java
上一篇:go slice使用
下一篇:返回列表
