1、局部變量初始化:對於方法的局部變量,java以編譯時錯誤的形式來保證局部變量的初始化。
2、成員變量:基本數據類型會被自動初始化爲0,布爾類型被初始化爲false,對象的引用被初始化爲null。
3、靜態數據的初始化:以下代碼演示靜態存儲區域是何時初始化的。
- package test_2012_10.Static;
- import test_2012_10.Utils.Print;
- class Bowl{
- Bowl(int marker){
- Print.print("Bowl(" + marker + ")");
- }
- void f1(int marker){
- Print.print("f1(" + marker + ")");
- }
- }
- class Table{
- static Bowl bowl1 = new Bowl(1);
- Table(){
- Print.print("Table()");
- bowl2.f1(1);
- }
- void f2(int marker){
- Print.print("f2(" + marker + ")");
- }
- static Bowl bowl2 = new Bowl(2);
- }
- class CupBoard{
- Bowl bowl3 = new Bowl(3);//類的成員變量(在執行構造方法前初始化)
- static Bowl bowl4 = new Bowl(4);
- CupBoard(){
- Print.print("CupBoard()");
- bowl4.f1(2);
- }
- void f3(int marker){
- Print.print("f3(" + marker + ")");
- }
- static Bowl bowl5 = new Bowl(5);
- }
- public class Static_Test {
- public static void main(String[] args) {
- Print.print("Creating new CupBoard() in main");
- new CupBoard();
- Print.print("Creating new CupBoard() in main");
- new CupBoard();
- table.f2(1);
- cupBoard.f3(1);
- }
- static Table table = new Table();//首先會初始化靜態域
- static CupBoard cupBoard = new CupBoard();
- }
- 結果如下:
- owl(1)
- Bowl(2)
- Table()
- f1(1)
- Bowl(4)
- Bowl(5)
- Bowl(3)
- CupBoard()
- f1(2)
- Creating new CupBoard() in main
- Bowl(3)
- CupBoard()
- f1(2)
- Creating new CupBoard() in main
- Bowl(3)
- CupBoard()
- f1(2)
- f2(1)
- f3(1)
總結一下對象創建的過程,假設有個名爲Dog的類
1、即使沒有顯式的使用static關鍵字,構造器實際上也是靜態方法。因此,當首次創建類型爲Dog的對象時(構造器可以看成是靜態方法),或者Dog類的靜態方法/靜態域首次被訪問時,Java解釋器必須查找類路徑,以定位Dog.class文件。
2、然後載入Dog.class,有關靜態初始化的所有操作都會執行。因此,靜態初始化只在Class對象首次加載的時候進行一次。
3、當用new Dog()創建對象的時候,首先在堆上爲Dog對象分配足夠的存儲空間。
4、這塊存儲空間會被清零,這就自動的將Dog對象中所有基本數據類型都設置成了默認值(對於數字來說是0,對於布爾和字符型也相同),而引用則被設置成null。
5、執行所有出現於字段定義處的初始化動作。
6、執行構造器,這可能會牽扯很多動作,尤其是涉及到繼承。