在面向對象程式設計中,程式設計人員應該在意“資源”。比如
<a href="http://www.bysocket.com/?p=566#">?</a>
1
<code>string hello = "hello";</code>
在代碼中,我們很在意在記憶體中string類型的hello,它是有一個生命周期的。在它生命周期中,初始化(initialization)和清理(cleanup)是兩個重要的環節。尤其是c程式中,很多bug會出現在對象初始化和清理的環節。這樣會造成一些程式安全問題。
《think in java》中說道:
随着計算機革命的發展,”不安全“的程式設計方式已逐漸成為程式設計代價高昂的主因之一。
在java開發中,針對對象會在乎記憶體的兩個區域:對象的生存空間是堆(heap) — 方法調用及局部變量(也稱棧變量)的生存空間棧(stack)。如圖:

為了保證對象成功初始化,java像c++一樣引入了構造器(constructor),即在建立對象的時候被自動調用的特殊方法。自然,java額外提供了gc(垃圾回收器),對于不再使用的資源,垃圾回收機制會自動釋放資源。java通過類構造器建立新對象的時候,在使用此對象前,會調用其構造器進行初始化。如:
2
3
4
5
6
7
8
9
10
<code>public class voidconstructor {</code>
<code> </code>
<code> </code><code>voidconstructor(){</code>
<code> </code><code>// 構造器</code>
<code> </code><code>}</code>
<code> </code><code>void voidconstructor() {</code>
<code> </code><code>// void 方法,不是構造器</code>
<code>}</code>
1、預設構造器
這裡,voidconstructor是一個類,如果需要建立一個voidconstructor對象隻要
<code>voidconstructor constr = new voidconstructor();</code>
調用上面的代碼就可以通過這個預設構造器(即無參構造器),就生成一個voidconstuctor對象。代碼圖解如下
2、注意,構造器是特殊的方法,采取與類名同名。它沒有傳回值,這與傳回值為空的void方法不同。這裡,void方法名命名也是不規範,應該是“每個方法首字母小寫”,也一般不與類名相同。
另外,就算你類沒有寫構造器的話,編譯器會生成一個預設構造器。
下面跑個帶參構造器的例子:
11
12
13
14
15
16
17
18
19
<code>/**</code>
<code> </code><code>* @author jeff lee</code>
<code> </code><code>* @since 2015-9-7 16:54:19</code>
<code> </code><code>* 帶參數簡單構造器的展示</code>
<code> </code><code>*/</code>
<code>public class simpleconstructor2 {</code>
<code> </code><code>public static void main(string[] args) {</code>
<code> </code><code>for (int i = 0; i < 10; i++) {</code>
<code> </code><code>new child2(i);</code>
<code> </code><code>}</code>
<code>// child類</code>
<code>class child2 {</code>
<code> </code><code>child2(int i) {// 帶參數的child類構造器</code>
<code> </code><code>system.out.print("child init " + i + " ");</code>
eclipse中,右鍵run as — java application:
上面child2(int)是child類的唯一構造器,此時你先在編譯器中通過 new child2()來建立對象是不行的。
是以,構造器有助于避免開發中出現代碼錯誤。
二者,構造器可以用來初始化資源。其中,對象的建立與資源的初始化是捆綁在一起的。
休息一下吧~ 看看小廣告:
在建立一個對象時,是以繼承下來的對象都會被調用各構造器。比如說下面這個例子:
20
21
22
<code> </code><code>* @since 2015-9-10 08:56:18</code>
<code> </code><code>* 繼承中的構造器的案例</code>
<code>public class childconstructor extends personconstructor{</code>
<code> </code><code>childconstructor() {</code>
<code> </code><code>//super();</code>
<code> </code><code>system.out.println("making a child modle...");</code>
<code> </code><code>@suppresswarnings("unused")</code>
<code> </code><code>childconstructor childconstructor = new childconstructor();</code>
<code>class personconstructor {</code>
<code> </code><code>personconstructor() {</code>
<code> </code><code>system.out.println("making a person modle...");</code>
main函數運作結果如下:
1. 先分析下類uml,childconstructor 繼承 personconstructor,personconstructor 繼承 object:
2. super關鍵字,super用來調用父類的構造器。如果子類中沒有super關鍵字,編譯器會自動添加預設super()方法。是以,子類通過super()方法調用父類構造器。
3. 然後main函數中,通過new指令,啟動了childconstructor對象的建立。子類 childconstructor 構造器在執行時,第一件事通過super()調用父類,這又會連鎖反應到objerct類。是以,列印控制台先輸出 “父類先初始化”。
這過程就是構造器鍊(constructor chaining),即child對象 is-a person對象同時也 is-a object對象。如果建立child對象,也同時建立了person對象和object對象的部分。
4. 過程流程圖詳解(圖中是各對象構造器在堆棧塊中調用流程 圖中引用兩字有歧義):
構造器雖小,關鍵還是非常關鍵的。
本文小結:
2、有參構造器 3、繼承中的構造器 還有第一點的知識基礎補充