Java 入門指南 V2.00 - 單元 9 - 封裝




物件導向程式設計 (object-oriented programming) 有三大基本特性,分別是封裝 (encapsulation) 、繼承 (inheritance) 及多型 (polymorphism)



繼承的目的是讓類別 (class) 具有像是親屬的垂直關係(父母子女),子類別 (subclass) 可以擁有父類別 (superclass) 的屬性 (field) 及方法 (method) ,而多型像是親屬的平行關係(兄弟姊妹),多個子類別繼承自單一父類別之時,這些子類別就可以用父類別代替,父類別如同家族裡的「姓」,子類別則是「名」。


至於封裝的意思就是把屬性封在類別中,這還牽涉到程式設計中另一個重要的概念             資訊隱藏 (information hiding) ,主要就是不讓外界隨意存取類別的屬性,也就是說,只讓類別的屬性給同個類別的方法存取。


這就需要用到 private 修飾詞 (modifier) 了,當屬性宣告為 private 的時候,該屬性就只能由同一個類別存取,我們將 ClassDemo01 類別的屬性 a 封裝,改寫成 ClassDemo03 類別,程式如下


001public class ClassDemo03 {
002   private int a;
003
004   // setter 方法
005   public void setA(int p1) {
006      a = p1;
007   }
008
009   // getter 方法
010   public int getA() {
011      return a;
012   }
013
014   public int doSomething(int p1) {
015      return a + p1;
016   }
017
018   public static void main(String[] args) { 
019      ClassDemo03 d = new ClassDemo03();
020      // 利用 setter 設定屬性
021      d.setA(11);
022
023      System.out.println();
024      // 利用 getter 印出屬性 a
025      System.out.println(d.getA());
026      System.out.println(d.doSomething(1));
027      System.out.println();
028   }
029}
030 
031/* 檔名: ClassDemo03.java
032   作者: Kaiching Chang
033   時間: September, 2014  */

首先,屬性宣告為 private ,這樣屬性就只限類別 中可存取


002private int a;

權限修飾詞有三個,分別是 publicprivateprotected ,加上不宣告權限修飾詞的形式,共有四種不同的權限。

接著如果要讓外界可以存取已封裝的屬性,就要另外設置 publicgettersetter 方法


004// setter 方法
005public void setA(int p1) {
006   a = p1;
007}
008
009// getter 方法
010public int getA() {
011   return a;
012}

編譯後執行,結果如下



留意設定屬性 a 已經改成在建立物件後呼叫 setter 方法


020// 利用 setter 設定屬性
021d.setA(11);

這是 setter 方法的用途沒錯,不過如果我們想要建立物件的同時設定好屬性,就需要自訂建構子 (constructor) 了。


中英文術語對照


物件導向程式設計object-oriented programming
封裝encapsulation
繼承inheritance
多型polymorphism
類別class
父類別superclass
屬性field
方法method
資訊隱藏information hiding
修飾詞modifier
建構子constructor

重點整理


  1. 物件導向程式設計的三大基本特性是封裝、繼承及多型,繼承像是親屬父母子女的垂直關係,多型像是兄弟姊妹的平行關係。
  2. 封裝就是把屬性封在類別中,這是資訊隱藏的概念,需要把屬性宣告為 private
  3. 權限修飾詞有 publicprivateprotected ,加上不宣告權限修飾詞的形式,共有四種不同的權限。
  4. 存取已封裝的屬性需要用 publicgettersetter 方法。

問題與討論


  1. 物件導向程式設計有哪三大基本特性?
  2. 什麼是封裝?為什麼要做封裝?
  3. 什麼是繼承?繼承機制有什麼優點?
  4. 什麼是多型?可以用什麼方式比擬嗎?
  5. 什麼是 gettersetter ?為什麼要有 gettersetter

the end

沒有留言: