Java程序的執行順序
有這樣的一段程序:
class Person {
?int age = 0;
?public Person() {
??System.out.println("2、然后執行了super");
?}
?public void fun() {
??System.out.println("super.age=" + age);
?}
}
public class Test4 extends Person {
?static {
??System.out.println("1、先執行了static區域");
?}
?int age = 10;
?public Test4() {
??super.fun();
??System.out.println("3、然后執行了this() age=" + age);
?}
?public Test4(int age) {
??this();
??System.out.println("4、然后執行了this(int age) 年齡是:" + age);
?}
?public static void main(String[] args) {
??Test4 test = new Test4(20);
?}
}
運行的結果如下:
1、先執行了static區域
2、然后執行了super
super.age=0
3、然后執行了this() age=10
4、然后執行了this(int age) 年齡是:20
????? 有以上程序的運行結果我們不難發現java程序的執行步驟:對于static域的成員或static變量或static函數來說在JVM裝載類的時候就已經為這些變量分配了實際的空間。在完成這些工作后,程序再去尋找函數main()的入口,執行main()中的代碼塊。
???????在這里順便說一下棧空間和堆空間的區別:個人認為程序運行時它會申請一片空間,那么在程序中定義的變量在程序運行時都會占用這片空間中的一塊,而堆空間是通過new關鍵字所產生的對象等所占用的空間。在該程序中,當使用new Test4(20)時程序便會首先執行該類中非靜態變量的默認初始化,即在該程序中設a的初值為0;完成后然后看看構造函數中有沒有傳遞形參過來,若有則先完成對其的賦值,即綁定構造方法的參數;然后檢查構造函數中有沒有this()或super()等形式的代碼,若有則優先執行,于是在該程序中執行代碼this();再跳轉到另一個構造函數,這個構造函數執行與第一個構造函數一樣的過程,于是先自動調用父類的構造函數執行其中的代碼,然后再去對在類中定義的變量完成顯示的初始化。一切工作完成后便會接著執行構造后數中那些真正屬于它的代碼段。