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();
}
}
運行結果:
分析:
- 主函數執行,調用子類構造函數;(30行)
- 執行子類構造函數,默認初始化子類成員變量x=0;(20行)
- 執行子類構造函數中的super();調用父類構造函數;
- 執行父類構造函數,默認初始化父類成員變量x=0;(6行)
- 執行父類構造函數中的super();調用父類(Object)構造函數;
- 顯式初始化父類成員變量x=1;
- 執行父類構造代碼塊(4行),輸出結果第一句(父類的構造代碼塊執行,此時的x=1);
- 執行第7行,輸出結果第二句(父類的構造函數執行,此時的x=1);
- 執行第8行,即print();注意是this.print();此時的this指的是子類對象的引用;
- 執行子類的print()函數(23行),輸出結果第三句(子類的print函數執行,此時的x=0);
- 父類構造函數執行完,也即子類構造函數中的super()執行完;
- 顯式初始化子類成員變量x=2;
- 執行子類構造代碼塊(18行),輸出結果第四句(子類的構造代碼塊執行,此時的x=2);
- 執行21行,輸出結果第五句(子類的構造函數執行,此時的x=2);
- 完畢。
總結:
在構造函數中執行的內容順序如下:
- 默認初始化成員變量;
- super();
- 顯式初始化成員變量;
- 構造代碼塊;
- 自定義代碼;