前面一篇講到了對象創建過程、初始化相關函數,并介紹了默認初始化值,這篇文章我們繼續講解Java基礎初始化的相關內容。
四、初始化方法
在定義類成員變量的地方為其賦值。
例如:char ch=’x’;
byte b=47;
Depth d=new Depth();//如果沒有為d指定初始值就嘗試使用它,就會出現運行時錯誤。
通過調用某個方法來提供初值:
例如:
public class MethodInit{
int i=f();
int f(){
Return 11;
}
}
構造器初始化:
public class Counter{
int i;
Counter(){
i=7;
}
}
利用static塊進行初始化:
static{
......
}
五、初始化順序:
無繼承情況的初始化順序:
靜態塊和靜態數據按定義的先后順序進行初始化。
普通成員初始化。
構造函數。
有繼承情況的初始化順序:
父類的靜態塊和靜態數據按定義的先后順序進行初始化。
子類的靜態塊和靜態數據按定義的先后順序進行初始化。
父類的普通成員初始化。
父類的構造函數。
子類的普通成員初始化。
子類的構造函數。
Static關鍵字不能應用于局部變量,只能作用于域,如果一個域是靜態的基本類型域且沒有對它進行初始化那么它就會獲得基本類型的標準初值,如果是一個對象的引用那么它的默認初始化值就是null。
靜態初始化只有在必要時刻才會進行,當首次生成這個類的一個對象時,或者訪問屬于那個類的靜態數據成員時,才開始初始化。并且靜態初始化動作僅執行一次。
無繼承的初始化順序,代碼驗證:
輸出如下所示:
1、靜態成員變量初始化
2、執行static塊:
靜態塊變量初始化
3、普通成員變量初始化
4、構造函數被調用
5、執行成員方法
3、普通成員變量初始化
4、構造函數被調用
5、靜態變量初始化只執行一次
有繼承的初始化順序代碼驗證:
輸出結果如下所示:
1、父類靜態成員變量初始化
2、執行父類static塊:
父類靜態塊變量初始化
3、執行子類static塊:
子類靜態塊變量初始化
4、子類靜態成員變量初始化
5、父類普通成員變量初始化
6、父類構造函數被調用
7、子類普通成員變量初始化
8、子類構造函數被調用
9、調用成員方法
5、父類普通成員變量初始化
6、父類構造函數被調用
7、子類普通成員變量初始化
8、子類構造函數被調用