建構子 (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
沒有留言:
張貼留言