天天看點

變量、初始化塊和構造方法的初始化順序問題(筆試題)

在某公司面試時碰見的該題目,

給出如下程式,讓寫出程式列印的語句的順序,也就是程式加載執行的過程。

當時确實有些懵了,隻根據大體印象寫了答案。回來後寫程式跑了一遍,自己還真是沒猜對。是以貼出來幫助記憶并與大家共賞!!

看完該程式不妨自己先寫個輸出語句的順序然後寫程式執行看是否與自己的判斷一緻。

先把程式執行的結果貼上:

從輸出結果可以看出,靜态變量和靜态初始化塊隻在程式加載的時候執行一次,執行次序在最前面,是全局的;

構造塊的加載順序在靜态塊之後但在構造方法之前,而且在構造塊加載之前,變量已經加載;

構造方法是在靜态變量,靜态塊,變量,構造塊後才加載的,是在類執行個體化時,除了調用方法外的最後加載的位置;

因為靜态變量和靜态塊都是全局的,是以在程式加載時就已經加載,不會因為是子類中的靜态變量和靜态塊就比父類的構造塊加載晚,但在都是靜态變量或靜态塊的情況下,

總是先初始化父類的,然後初始化子類的。

同樣的因為構造塊和構造方法不是全局的,而且子類在執行個體化時總是先調用父類的構造塊和構造方法,是以父類的構造塊和構造方法在子類的之前調用。即在執行個體化子類時,程式會先調用父類的執行個體化構造塊或者構造方法,然後才會調用子類的構造塊和構造方法完成子類的執行個體化。

而且,構造塊和構造方法會在每次執行個體化的時候都執行,靜态變量和靜态塊隻會執行一次(不管該類執行個體化多少對象)。