請執行下面**,檢視執行結果,並帶著問題,嘗試第二次debug程式。
class a
public a() }
class b extends a
public b() }
public class box
}
執行結果:
由此,可以看出類中各成員初始化的順序是:
父類的靜態字段——>父類靜態**塊——>子類靜態字段——>子類靜態**塊——>父類成員變數(非靜態字段)——>父類非靜態**塊——>父類構造器——>子類成員變數——>子類非靜態**塊——>子類構造器另外,在靜態**塊中不能訪問成員變數,想想這是為什麼?它是否與成員的初始化順序有必然的聯絡?
面試的時候遇到了這樣乙個問題:
class a
public a()
public a(int n) }
class b extends a
public b()
public b(int n) }
public class classload
}
如上**,當呼叫了子類b的有參構造時,父類的構造器先執行肯定是確定無疑,但是是執行哪個構造器呢?執行結果如下:
執行結果中可以看到,父類a依然是執行了無參構造,也就是說,如果子類構造器中未顯式指定父類構造器,那麼將會預設執行父類的無參構造,此時,如果你過載了乙個父類的有參構造而沒有指定無參構造,那麼編譯將不會通過!!
例如錯誤**如下:
java中類的載入,及執行順序
類載入的順序 1 載入靜態成員 塊 靜態變數 靜態塊按書寫先後順序執行 先遞迴地載入父類的靜態成員 塊 object 的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入。如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的...
java中類的載入順序
有條準則寫在前面 載入子類前必載入父類,例項化子類前必例項化父類。也就是說,載入的時候會執行靜態塊,其順序為 父類的靜態塊 子類的靜態塊 父類的構造方法 子類的構造方法 同時,宣告不會載入,例如在test類中,使用father f null,不會載入father類的,也就不會執行father類的靜態...
Java中類的載入順序總結
父類靜態物件和靜態 塊 子類靜態物件和靜態 塊 父類非靜態物件和非靜態 塊 父類建構函式 子類非靜態物件和非靜態 塊 子類建構函式 其中1和2中的靜態塊按照宣告順序依次執行,在類載入到方法區的時候執行的,不需要new類的例項,而且只需執行一次。而非靜態 塊是在建立物件時執行,執行順序為靜態塊 mai...