java 构造函数是如何执行的
1.構造函數不是方法??!
原因1:方法的話,會直接執行方法體內的代碼,但是構造函數首先執行的不是{}里的代碼塊,而是給對象的成員初始化;
2.方法可以被調用其他方法調用,但是構造函數不能被方法或變量調用。
package com.statics.www;
public class Son {
//構造函數執行第二步:
private int num2=1*cal2();
//構造函數執行第一步:
public static int num1=1*cal1();
//構造函數第0步:
public static int cal1(){
System.out.println("構造函數第一步:靜態變量賦值!");
return 1;
}
public static int cal2(){
System.out.println("構造函數第二步:非靜態全局變量賦值");
return 2;
}
{
System.out.println("構造函數第三步:代碼塊!");
}
public Son(){
System.out.println("構造函數第四步:執行構造函數內部代碼塊!");
}
}
執行結果為:
2. 從上面測試得出結論:
構造函數初始化對象時,執行的順序是
0.方法優先存在于任何變量或者對象,存在于類中,而不是對象中。即構造對象前,方法就存在。
第一步. 靜態變量賦值
第二步.代碼塊或者全局變量,(執行順序由代碼位置決定,如果代碼塊在前,優先執行代碼塊;如果變量在前,優先變量賦值)
第三步.執行構造函數內部代碼
3.繼承中的構造函數執行順序:
0.子類重寫了父類的方法;
1.調用父類構造函數();
2.調用子類構造函數();
父類代碼:
package com.statics.www;
public class Father {
private int num=1;
public Father(){
System.out.println("構造father,接下來調用Test()");
Test();
}
public void Test(){
System.out.println("調用Father被重寫的方法Test(),現在的Num值是"+num);
}
}
子類代碼:
package com.statics.www;
public class Son extends Father {
private int num=1;
public Son(){
System.out.println("執行Son構造函數內部代碼塊!");
}
public void Test(){
System.out.println("調用Son被重寫的方法Test(),現在的Num值是"+num);
}
}
可以看出被調用的Test()方法是子類的Test(),另外特別注意Num =0!!!!!!因為父類的num 是private的不能繼承,但是子類的num還沒有被賦值(要等到父類構造完成,才能構造子類),所以默認是0
總結
以上是生活随笔為你收集整理的java 构造函数是如何执行的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 101. 对称二叉树023(BFS)
- 下一篇: 张嘉文直播不慎露脸张嘉文直播不慎露脸吗