Java對象初始化過程例子分析(一)

Java對象初始化過程例子分析(一)

class Base{
	int x = 1;
	{
		System.out.println("父類的構造代碼塊執行,此時的x="+x);
	}
	Base(){
		System.out.println("父類的構造函數執行,此時的x="+x);
		print();
	}
	public void print(){
		System.out.println("父類的print函數執行,此時的x="+x);
	}
}

class Child extends Base{
	int x = 2;
	{
		System.out.println("子類的構造代碼塊執行,此時的x="+x);
	}
	Child(){
		System.out.println("子類的構造函數執行,此時的x="+x);
	}
	public void print(){
		System.out.println("子類的print函數執行,此時的x="+x);
	}
}

public class Test{
	public static void main(String[] args) {
		new Child();
	}
}


運行結果:



分析:



  1. 主函數執行,調用子類構造函數;(30行)
  2. 執行子類構造函數,默認初始化子類成員變量x=0;(20行)
  3. 執行子類構造函數中的super();調用父類構造函數;
  4. 執行父類構造函數,默認初始化父類成員變量x=0;(6行)
  5. 執行父類構造函數中的super();調用父類(Object)構造函數;
  6. 顯式初始化父類成員變量x=1;
  7. 執行父類構造代碼塊(4行),輸出結果第一句(父類的構造代碼塊執行,此時的x=1);
  8. 執行第7行,輸出結果第二句(父類的構造函數執行,此時的x=1);
  9. 執行第8行,即print();注意是this.print();此時的this指的是子類對象的引用;
  10. 執行子類的print()函數(23行),輸出結果第三句(子類的print函數執行,此時的x=0);
  11. 父類構造函數執行完,也即子類構造函數中的super()執行完;
  12. 顯式初始化子類成員變量x=2;
  13. 執行子類構造代碼塊(18行),輸出結果第四句(子類的構造代碼塊執行,此時的x=2);
  14. 執行21行,輸出結果第五句(子類的構造函數執行,此時的x=2);
  15. 完畢。

總結:

在構造函數中執行的內容順序如下:

  1. 默認初始化成員變量;
  2. super();
  3. 顯式初始化成員變量;
  4. 構造代碼塊;
  5. 自定義代碼;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章