Java 入門指南 V2.00 - 單元 10 - 建構子




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



記不記得建立 ClassDemo01 時,需要用 new 關鍵字 (keyword) , new 後面接的是附上小括弧的類別 (class) 名稱


013ClassDemo01 d = new ClassDemo01();

完整的 ClassDemo01.java ,請參考單元 8

類別名稱加上小括弧,其實就是呼叫建構子來建立物件,如果沒有自行定義建構子,編譯器會自動替我們補上一個。下面我們給 ClassDemo01 增加建構子當作例子,新類別寫在 ClassDemo04 中,如下


001public 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// 這裡定義建構子
005public ClassDemo04(int p1) {
006   setA(p1);
007}

此例 ClassDemo04() 有一個 int 參數 (parameter) p1 ,然後直接以 p1 設定屬性 (field) a 。注意建構子沒有回傳值 (return value) ,這是因為建構子就是用來建立物件,因此預設回傳物件本身。


由於建構子有參數,因此呼叫建構子建立物件時也需要提供參數


022ClassDemo04 d = new ClassDemo04(10);

建構子也可以多載 (overload) ,就是可以自行定義各種參數版本的建構子,其中包括沒有參數的版本,編譯器 (compiler) 預設的建構子也是沒有沒有參數的版本。

編譯執行,結果如下



下面我們介紹個小技巧,建構子或方法的參數識別字 (identifier) 也可以跟屬性一樣,這時候存取屬性就要利用 this 關鍵字了,我們將 ClassDemo04 改成用 this 存取屬性,如下


001public 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 加小數點存取


008public void setA(int a) {
009   // 利用 this 存取屬性
010   this.a = a;
011}

doSomething() 的地方也是


017public 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

重點整理


  1. 建構子是建立物件時所執行的特別方法,主要用途是初始化屬性,有參數而沒有回傳值。
  2. 建構子可以多載,如果沒有定義建構子,編譯器就會自動加上沒有參數的建構子。
  3. 建構子或方法的名稱如果和屬性一樣,就要用關鍵字 this 存取屬性。

問題與討論


  1. 建構子與方法有什麼不同呢?屬性可不可以由方法設定初值呢?
  2. 為什麼沒有定義建構子的話,編譯器會自動補上一個?

the end

沒有留言: