程式猿小白上路之旅第一個星期
這是來到達內的第一個星期,這個星期還沒有正式開課主要就是熟悉環境,上一下訓練營。訓練營其實就是對完全沒接觸過程式設計的人的前期鋪墊,當然我是例外。這個星期我主要是通過達內的內部資源(ppt和視訊)自學,頗有收穫,但是我想將這些留到後面講。現在談一下我偶然發現的問題。
一般的,我們通常只在一個.java檔案中寫一個類,但這個類中有時有一個和類名同名的方法且沒有返回值有時又沒有那麼它到底是什麼呢?
通過查閱資料我知道了它是構造器。
構造器其實就是一個方法但沒有返回值,其作用就是初始化成員變數,一個類可以有多個構造器,構造器不能有以下非訪問性質的修飾: abstract, final, native, static, 或者 synchronized。構造器分為預設構造器和非預設構造器。
非預設構造器又分為:例項構造器和靜態構造器。例項構造器負責初始化類中的例項變數 ,它只有在使用者用new關鍵字為物件分配記憶體時才被呼叫。而且作為引用型別 的類,其例項化後的物件必然是分配在堆上。使用者只宣告物件是不會產生構造器呼叫的。
預設構造器是在一個類沒有宣告任何構造器的情況下,編譯器 強制為該類新增的一個無引數的構造器,該構造器僅僅呼叫父類的無引數構造器。預設構造器實際上是編譯器為保證每一個類都有至少一個構造器而採取的附加規則。注意這裡的三個要點:
1.子類沒有宣告任何構造器;
2.編譯器為子類加的預設構造器一定為無引數的構造器;
3.父類一定要存在一個無引數的構造器。
構造器在繼承時需要特別的注意,為了保證父類成員變數 的正確初始化,子類的任何構造器預設的都必須呼叫父類的某一構造器,具體呼叫哪個構造器要看構造器的初始化引數列表。如果沒有初始化引數列表,那麼子類的該構造器就呼叫父類的無引數構造器;如果有初始化引數列表,那麼子類的該構造器就呼叫父類對應的引數構造器。
我們看到類的構造器的宣告中有public修飾符 ,那麼當然也可以有protected/private/ internal修飾符。根據修飾符規則,我們如果將一個類的構造器修飾為private,那麼我們在繼承該類的時候,我們將不能對這個private的構造器進行呼叫,我們是否就不能對它進行繼承了嗎?正是這樣。實際上這樣的類在我們的類內的成員變數 都是靜態(static)時,而又不想讓類的使用者對它進行例項化,這時必須遮蔽編譯器 為我們暗中新增的構造器(編譯器新增的構造器都為public),就很有必要作一個private的例項構造器了。protected/internal也有類似的用法。
構造器是為了建立一個類的例項。這個過程也可以在建立一個物件的時候用到:Platypus p1 = new Platypus(); 構造器可以用來在初始化物件時初始化資料成員 ,一個類可以有多個構造器。一個類的構造器的名稱必須與該類的名稱一致。要退出構造,可以使用返回語句"return;"。
用法:
構造器和方法使用關鍵字this有很大的區別。方法引用this指向正在執行方法的類的例項。靜態方法 不能使用this關鍵字,因為靜態方法不屬於類的例項,所以this也就沒有什麼東西去指向。構造器的this指向同一個類中,不同引數列表的另外一個構造器,