
建構子 (constructor) 是一種特別的方法 (method) ,特別的地方在建構子是建立物件 (object) 時所執行的方法

記不記得建立 ClassDemo01 時,需要用 new 關鍵字 (keyword) , new 後面接的是附上小括弧的類別 (class) 名稱
| 013 | ClassDemo01 d = new ClassDemo01(); |
完整的 ClassDemo01.java ,請參考單元 8 。
類別名稱加上小括弧,其實就是呼叫建構子來建立物件,如果沒有自行定義建構子,編譯器會自動替我們補上一個。下面我們給 ClassDemo01 增加建構子當作例子,新類別寫在 ClassDemo04 中,如下
| 001 | public class ClassDemo04 { |
| 002 | private int a; |
| 003 | |
| 004 | // 這裡定義建構子 |
| 005 | public ClassDemo04(int p1) { |
| 006 | setA(p1); |
| 007 | } |
| 008 | |
| 009 | public void setA(int p1) { |
| 010 | a = p1; |
| 011 | } |
| 012 | |
| 013 | public int getA() { |
| 014 | return a; |
| 015 | } |
| 016 | |
| 017 | public int doSomething(int p1) { |
| 018 | return a + p1; |
| 019 | } |
| 020 | |
| 021 | public static void main(String[] args) { |
| 022 | ClassDemo04 d = new ClassDemo04(10); |
| 023 | |
| 024 | System.out.println(); |
| 025 | System.out.println(d.getA()); |
| 026 | System.out.println(d.doSomething(1)); |
| 027 | System.out.println(); |
| 028 | } |
| 029 | } |
| 030 | |
| 031 | /* 檔名: ClassDemo04.java |
| 032 | 作者: Kaiching Chang |
| 033 | 時間: September, 2014 */ |
建構子的定義在第 5 行到第 7 行
| 004 | // 這裡定義建構子 |
| 005 | public ClassDemo04(int p1) { |
| 006 | setA(p1); |
| 007 | } |
此例 ClassDemo04() 有一個 int 參數 (parameter) p1 ,然後直接以 p1 設定屬性 (field) a 。注意建構子沒有回傳值 (return value) ,這是因為建構子就是用來建立物件,因此預設回傳物件本身。
由於建構子有參數,因此呼叫建構子建立物件時也需要提供參數
| 022 | ClassDemo04 d = new ClassDemo04(10); |
建構子也可以多載 (overload) ,就是可以自行定義各種參數版本的建構子,其中包括沒有參數的版本,編譯器 (compiler) 預設的建構子也是沒有沒有參數的版本。
編譯執行,結果如下

下面我們介紹個小技巧,建構子或方法的參數識別字 (identifier) 也可以跟屬性一樣,這時候存取屬性就要利用 this 關鍵字了,我們將 ClassDemo04 改成用 this 存取屬性,如下
| 001 | public class ClassDemo05 { |
| 002 | private int a; |
| 003 | |
| 004 | public ClassDemo05(int a) { |
| 005 | setA(a); |
| 006 | } |
| 007 | |
| 008 | public void setA(int a) { |
| 009 | // 利用 this 存取屬性 |
| 010 | this.a = a; |
| 011 | } |
| 012 | |
| 013 | public int getA() { |
| 014 | return a; |
| 015 | } |
| 016 | |
| 017 | public int doSomething(int a) { |
| 018 | // 參數跟屬性使用相同的識別字 |
| 019 | return this.a + a; |
| 020 | } |
| 021 | |
| 022 | public static void main(String[] args) { |
| 023 | ClassDemo05 d = new ClassDemo05(13); |
| 024 | |
| 025 | System.out.println(); |
| 026 | System.out.println(d.getA()); |
| 027 | System.out.println(d.doSomething(9)); |
| 028 | System.out.println(); |
| 029 | } |
| 030 | } |
| 031 | |
| 032 | /* 檔名: ClassDemo04.java |
| 033 | 作者: Kaiching Chang |
| 034 | 時間: September, 2014 */ |
setter 部分改成用參數 a 設定屬性 a ,屬性前要用 this 加小數點存取
| 008 | public void setA(int a) { |
| 009 | // 利用 this 存取屬性 |
| 010 | this.a = a; |
| 011 | } |
doSomething() 的地方也是
| 017 | public int doSomething(int a) { |
| 018 | // 參數跟屬性使用相同的識別字 |
| 019 | return this.a + a; |
| 020 | } |
編譯後執行,結果如下

基本的類別定義包含屬性、方法及建構子,接下來我們看到 Java 組織類別檔案的方式,也就是套件 (package) 。
中英文術語對照
| 建構子 | constructor |
| 方法 | method |
| 物件 | object |
| 關鍵字 | keyword |
| 類別 | class |
| 參數 | parameter |
| 屬性 | field |
| 回傳值 | return value |
| 多載 | overload |
| 編譯器 | compiler |
| 識別字 | identifier |
| 套件 | package |
重點整理
- 建構子是建立物件時所執行的特別方法,主要用途是初始化屬性,有參數而沒有回傳值。
- 建構子可以多載,如果沒有定義建構子,編譯器就會自動加上沒有參數的建構子。
- 建構子或方法的名稱如果和屬性一樣,就要用關鍵字 this 存取屬性。
問題與討論
- 建構子與方法有什麼不同呢?屬性可不可以由方法設定初值呢?
- 為什麼沒有定義建構子的話,編譯器會自動補上一個?
the end
沒有留言:
張貼留言