物件導向程式設計 (object-oriented programming) 有三大基本特性,分別是封裝 (encapsulation) 、繼承 (inheritance) 及多型 (polymorphism)
繼承的目的是讓類別 (class) 具有像是親屬的垂直關係(父母子女),子類別 (subclass) 可以擁有父類別 (superclass) 的屬性 (field) 及方法 (method) ,而多型像是親屬的平行關係(兄弟姊妹),多個子類別繼承自單一父類別之時,這些子類別就可以用父類別代替,父類別如同家族裡的「姓」,子類別則是「名」。
至於封裝的意思就是把屬性封在類別中,這還牽涉到程式設計中另一個重要的概念 資訊隱藏 (information hiding) ,主要就是不讓外界隨意存取類別的屬性,也就是說,只讓類別的屬性給同個類別的方法存取。
這就需要用到 private 修飾詞 (modifier) 了,當屬性宣告為 private 的時候,該屬性就只能由同一個類別存取,我們將 ClassDemo01 類別的屬性 a 封裝,改寫成 ClassDemo03 類別,程式如下
001 | public 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 ,這樣屬性就只限類別 中可存取
002 | private int a; |
權限修飾詞有三個,分別是 public 、 private 及 protected ,加上不宣告權限修飾詞的形式,共有四種不同的權限。
接著如果要讓外界可以存取已封裝的屬性,就要另外設置 public 的 getter 與 setter 方法
004 | // setter 方法 |
005 | public void setA(int p1) { |
006 | a = p1; |
007 | } |
008 | |
009 | // getter 方法 |
010 | public int getA() { |
011 | return a; |
012 | } |
編譯後執行,結果如下
留意設定屬性 a 已經改成在建立物件後呼叫 setter 方法
020 | // 利用 setter 設定屬性 |
021 | d.setA(11); |
這是 setter 方法的用途沒錯,不過如果我們想要建立物件的同時設定好屬性,就需要自訂建構子 (constructor) 了。
中英文術語對照
物件導向程式設計 | object-oriented programming |
封裝 | encapsulation |
繼承 | inheritance |
多型 | polymorphism |
類別 | class |
父類別 | superclass |
屬性 | field |
方法 | method |
資訊隱藏 | information hiding |
修飾詞 | modifier |
建構子 | constructor |
重點整理
- 物件導向程式設計的三大基本特性是封裝、繼承及多型,繼承像是親屬父母子女的垂直關係,多型像是兄弟姊妹的平行關係。
- 封裝就是把屬性封在類別中,這是資訊隱藏的概念,需要把屬性宣告為 private 。
- 權限修飾詞有 public 、 private 及 protected ,加上不宣告權限修飾詞的形式,共有四種不同的權限。
- 存取已封裝的屬性需要用 public 的 getter 與 setter 方法。
問題與討論
- 物件導向程式設計有哪三大基本特性?
- 什麼是封裝?為什麼要做封裝?
- 什麼是繼承?繼承機制有什麼優點?
- 什麼是多型?可以用什麼方式比擬嗎?
- 什麼是 getter 與 setter ?為什麼要有 getter 與 setter ?
the end
沒有留言:
張貼留言