C++(C++培訓 一樣,Java中也有所謂的缺省構造函數,也就是沒有任何參數的構造函數。Java的構造函數有幾個基本的特性:

  1)如果類中沒有顯式的制定構造函數的時候,編譯器會自動為該類添加一個缺省的構造函數;

  2)如果類中有明確定義了一個以上的構造函數,編譯器則不會再為該類自動添加任何構造函數;

  3)編譯器在調用子類的每個構造函數之前會先調用該父類的缺省構造函數。

  利用以上的特性,我們可以通過顯式定義一個非缺省構造函數,同時不顯式定義缺省構造函數來使得該類不可被繼承。這個技巧意義不大,因為我們也可以簡單地通 過final關鍵字來指明該類不可被繼承。但是反過來就是一個值得注意的地方,如果我們希望某類可以被繼承,那么在定義了非缺省構造函數之后,要記得顯式 定義一個缺省構造函數。這是一個編程初手容易犯的錯誤,有一些初學者經常會忘了在這種情況下顯式定義一個缺省構造函數而導致該類不可被繼承。

  通過將所有的構造函數私有化,我們可以實現類的不可實例化。在一些工具類上我們經常可以看到這種做法。我們也可以將某類定義為抽象類來實現其不可實例化。 但兩者比較起來,前者會更優雅,更明確,因為將某類定義為抽象類會誤導用戶去繼承它。同時,這個技巧也會使得該類不可被繼承,所以我們要根據實際情況來恰 當選擇是用抽象類還是使用私有化構造函數。

  除了普通的構造函數之外,我們有時也會通過一些工廠方法來創建對象,也就是Factory,Factory Method和Singleton等設計模式的應用。在使用singleton模式的時候,我們要記得將構造函數私有化,只有這樣才能真正保證該類具有唯一實例。此外,如果某個類同時提供了靜態工廠方法和構造函數,我們要優先考慮前者,因為這樣可以減少對象的創建。我們還經常使用對象池來創建對象。但是對 于對象池的使用必須慎重,在現有的JVM中,小對象的創建和回收是很快的,只有當對象是重量級的時候,使用對象池才會有意義,否則反而會使得程序不夠清 晰,簡潔。

  在Java中有明確的構造函數,但是并不象C++,它沒有析構函數。Java是通過finalizer( )方法來進行對象的銷毀。而子類的finalizer方法并不會象前文所提的構造函數一樣,主動調用父類的相應方法,因此一旦我們調用了finalizer方法,一定不要忘記先調用super.finalizer(), 這一點也是一些初手容易混淆的。在實際使用中,我們應該盡量避免顯式的調用finalizer,因為在虛擬機規范中,對該方法的執行并沒有明確的規定,不 同的JVM實現有自己不同的算法來安排finalizer,因此我們不能保證該方法能及時調用,甚至無法保證執行。