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