昨天看到
BlueIce的一個post,詭秘的Java構造問題。里面有一句話:“關于構造函數的作用以及類的構造問題,而這是初學者經常會犯甚至是有經驗的程序員偶爾也會犯的錯誤”。里面所提到問題的可以歸結為對象初始化問題。
我想避免此類問題出現的最佳方法是將對象的構造和初始化過程進行總結、概念化。這樣,即使出現問題也可以按照這個規律一步一步的找到問題的所在。
對象的初始化操作將遞歸如下的步驟進行:
1.設置實例變量的值為缺省的初始值(0,false,null),不同的數據類型有不同的初始值。
2.調用類的構造器(但是還是沒有執行構造方法體),綁定構造器函數。
3.如果構造器中有this()調用,則根據this()調用的參數調用相應的重載構造器,然后,轉到步驟5;否則轉到步驟4。
4.除java.lang.Object類外,調用父類中的初始化塊初始化父類的屬性,然后調用父類構造器,如果在構造器中有super()調用,則根據super()中的參數調用父類中相應的構造器。
5.使用初始化程序和初始化塊初始化成員。
6.執行構造器方法體中其他語句。
容易出現問題的地方:雖然變量在定義的時候進行了初始化,在實際初始化過程中還是先將其設為1所示默認值,然后在過程5才會真正的進行初始化。如果在這里調用了父類構造器的話,如果父類構造器中有相同變量的默認初始化的話(Java的動態綁定機制),就極為有可能出現問題。而這時候出現的問題通常難以察覺。