小A:“在使用構造器中的要注意哪些事項?”
大B:“1、構造器中一定不要建立自身的例項,否則會造成呼叫棧溢位錯誤。這個規則也適用於物件的例項變數,如果物件中有自身的引用,這個引用一定不能在定義中或者構造器中初始化。”
classa
{
aa=newa();
publica()
{
a=newa();
ab=newa();
}
}
大B:“以上三種情況都會造成棧溢位,這樣會造成一個無窮遞迴的呼叫棧。2、如果父類是一個抽象類,那透過呼叫父類的構造器,也可以將它初始化,並且初始化其中的資料。3、如果你要在構造器中呼叫一個方法時,將該方法宣告為private。對於這個規則是需要一些說明的,假使你的父類構造器中要呼叫一個非靜態方法,而這個方法不是private的又被子類所過載,這樣在實際建立子類的過程中遞迴呼叫到了父類的構造器時,父類構造器對這個方法的呼叫就會由於多型而實際上呼叫了子類的方法,當這個子類方法需要用到子類中例項變數的時候,就會由於變數沒有初始化而出現異常(至於為什麼子類中的例項變數沒有初始化可以參考上邊的例項初始化過程),這是Java不想看到的情況。而當父類構造器中呼叫的方法是一個private方法時,多型就不會出現,也就不會出現父類構造器呼叫子類方法的情況,這樣可以保證父類始終呼叫自己的方法,即使這個方法中呼叫了父類中的例項變數也不會出現變數未初始化的情況(變數初始化總是在當前類構造器主體執行之前進行)。”