構造器

構造器是一個創建對象時被自動調用的特殊方法,爲的是初始化。構造器的名稱應與類的名稱一致。

       當創建一個個對象時,系統會該對象的屬性默認初始化,基本類型屬性的值爲0(數值類型),false(布爾類型),把所有的引用類型設置爲null.

       構造器可以改變這種默認的初始化。

       構造器的作用:是創建java對象的重要途徑,是不是說構造器完全負責創建java對象?

       答:是創建java對象的重要途徑,通過new關鍵字調用構造器時,構造器也確實返回了該類的對象,但這個對象並不是完全由構造器負責創建的。

        首先要注意的是Java的構造器並不是函數,所以他並不能被繼承,這在我們extends的時候寫子類的構造器時比較的常見,即使子類構造器參數和父類的完全一樣,我們也要寫super就是因爲這個原因。

 
  構造器的修飾符比較的有限,僅僅只有public private protected這三個,其他的例如任何修飾符都不能對其使用,也就是說構造器不允許被成名成抽象、同步、靜態等等訪問限制以外的形式。
 
  因爲構造器不是函數,所以它是沒有返回值的,也不允許有返回值。但是這裏要說明一下,構造器中允許存在return語句,但是return什麼都不返回,如果你指定了返回值,雖然編譯器不會報出任何錯誤,但是JVM會認爲他是一個與構造器同名的函數罷了,這樣就會出現一些莫名其妙的無法找到構造器的錯誤,這裏是要加倍注意的。
 
  在我們extends一個子類的時候經常會出現一些意想不到的問題,我在這裏說一些和構造器有關的。

首先說一下Java在構造實例時的順序(不討論裝載類的過程)。

 
  構造的粗略過程如下:
 
  1、分配對象空間,並將對象中成員初始化爲0或者空,java不允許用戶操縱一個不定值的對象。
 
  2、執行屬性值的顯式初始化(這裏有一點變化,一會解釋,但大體是這樣的)。
 
  3、執行構造器
 
  4、將變量關聯到堆中的對象上

 介紹一下準備知識,以備一會來詳細說明這個的流程。

 

  this() 、super()是你如果想用傳入當前構造器中的參數 or 構造器中的數據調用其他構造器或者控制父類構造器時使用的,在一個構造器中你只能使用this()或者super()之中的一個,而且調用的位置只能在構造器的第一行,在子類中如果你希望調用父類的構造器來初始化父類的部分,那就用合適的參數來調用super(),如果你用沒有參數的super()來調用父類的構造器(同時也沒有使用this()來調用其他構造器),父類缺省的構造器會被調用,如果父類沒有缺省的構造器,那編譯器就會報一個錯誤。

     注意此處,我們經常在繼承父類的時候構造器中並不寫和父類有關的內容,此時如果父類沒有缺省構造器,就會出現編譯器添加的缺省構造器給你添麻煩的問題了哦。




案例

[java] view plain copy
  1. public class Manager extends Employee {  
  2.   private String department;  
  3.   public Manager(String name, double salary, String dept)  
  4.  {  
  5.    super(name, salary);  
  6.    department = dept;  
  7.  }  
  8.  public Manager(String n, String dept) {  
  9.    super(name);  
  10.    department = dept;  
  11.  }  
  12.  public Manager(String dept) {  
  13.   // 這裏就沒有super(),編譯器會自動地添加一個空參數的缺省super構造器,此時如果Employee類中沒有空參數的缺省構造器,那就會導致一個編譯錯誤  
  14.    department = d;  
  15.  }  
  16.  }  

發佈了29 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章