對象初始化過程
1.加載類
2.堆內存分配空間
3.屬性進行默認初始化
4.調用構造函數----->1.構造函數默認第一句super(); 2.顯示初始化 3.構造代碼塊初始化
5.調用父類構造函數----->同上
6.屬性顯示初始化
7.構造代碼塊初始化
8.構造函數自定義初始化
注意:不創建對象,構造代碼塊和構造器都不運行。
運行過程--->new 對象 先執行靜態代碼塊--->在執行構造代碼塊--->再執行構造代碼塊裏面的內容
加載過程--->先加載靜態(...)--->構造函數--->在構造函數里加載構造代碼塊。
結合實例分析:
class Demo
{
static int i=2;//隨着類的加載而加載。加載到方法區中的靜態區中。
int j=9;//定義了一個屬性,也就是一個成員變量,也叫實例變量。當對象存在時,該變量存在於堆內存的對象中。
static{//靜態代碼塊。隨着類的加載而執行。
System.out.println("靜態代碼塊...i="+i);
}
Demo(int a){//帶一個int參數的構造函數。
this();//調用了本類中空參數的構造函數。
System.out.println("有參的構造函數...i="+i+",j="+j);
}
{ //構造代碼塊,定義在類中的代碼塊,用於給所有對象進行初始化動作的代碼塊。
System.out.println("構造代碼塊...i="+i+",j="+j);
}
static void show(){//靜態函數。函數中沒有訪問非靜態的成員。
System.out.println("靜態show方法...i="+i);
}
Demo(){// 空參數的構造函數。
System.out.println("無參的構造函數..."+",j="+j);
}
}
class Test
{
public static void main(String[] args)
{
Demo d = new Demo(1);//通過Day06.class類文件創建了對象。
int a = Demo.i;
System.out.println("----");
new Demo();
show();
}
public static void show()
{}
}
執行過程解析:
1. 執行靜態代碼塊:靜態代碼塊...i=2
2. 再執行構造代碼塊:構造代碼塊...i=2,j=9
3. Demo(int a) 進棧後,第一行this()調用了本類中空參數的構造函數。所以Demo()進棧
4. Demo()第一句默認super(),之後屬性顯示初始化,構造代碼塊初始化,以後執行print:無參的構造函數...,j=9
5. Demo()出棧,接着執行Demo(int a):有參的構造函數...i=2,j=9 Demo(int a)出棧 堆內存分配空間釋放,等待垃圾回收
6. 執行int a = Demo.i; System.out.println("----");
7. new Demo()調用空參構造函數;
8. 執行構造代碼塊...i=2,j=9
9.無參的構造函數...,j=9
---------------------- android培訓 、 java培訓 、 期待與您交流! ---------------------- 詳細請查看:www.itheima.com