在初始化一個類時,到底是先執行哪一部分,總體的執行順序是什麼樣的呢,同樣,當類被釋放時,又是怎樣一個順序呢?先來看下面的代碼好了。
package net.moon.insignificant.commonclass;</p><p>class CommonSubClass extends CommonSupperClass {<br />static {<br />System.out.println("Common sub static initial");<br />}</p><p>public CommonSubClass() {<br />System.out.println("Common sub construct");<br />}</p><p>@Override<br />protected void finalize() throws Throwable {<br />// TODO Auto-generated method stub<br />System.out.println("Common sub finalize");<br />super.finalize();</p><p>}<br />}</p><p>abstract class CommonSupperClass {<br />public CommonSupperClass() {<br />System.out.println("Common super construct");<br />}</p><p>static {<br />System.out.println("Common supper static initial");<br />}</p><p>@Override<br />protected void finalize() throws Throwable {<br />// TODO Auto-generated method stub<br />System.out.println("Common supper finalize");<br />super.finalize();</p><p>}<br />}</p><p>public class Demo {<br />public static void main(String[] args) {<br />// TODO Auto-generated method stub<br />CommonSubClass css = new CommonSubClass();<br />css = null;<br />System.gc();</p><p>}</p><p>}<br />
只要運行上面的代碼,結果如下:
Common supper static initial<br />Common sub static initial<br />Common super construct<br />Common sub construct<br />Common sub finalize<br />Common supper finalize
其實大家已經清楚,在初始化時,執行的順序是:
1. 父類的靜態代碼塊
2. 子類的靜態代碼塊
3. 父類的構造方法
4. 子類的構造方法
釋放資料時,執行的順序是:
1. 子類的finalize方法
2. 父類的finalize方法
只是這裡一個意外是:竟然父類為抽象類別時也同樣會調用父類的構造方法,看來抽象類別在虛擬機器內部還是被執行個體化了。
下一篇: Java牛角尖【004】:Final類可以有protected屬性或方法嗎?