2012年3月4日 星期日

JAVA物件導向複習


  • 套件:解決類別名稱衝突的問題
  • 封裝
    • 主要好處:讓你可以改變程式碼的實作,而又不會破壞別人的程式碼(使用你的程式碼)
    • 設計概念:
      • 保護實體變數
      • 建立public存取函式,類別使用者不能直接存取實體變數
      • 對於函式的名稱,使用JavaBeans的命名慣例
  • 繼承
    • 好處:
      • 加強程式碼的再用性
      • 使用多型
    • IS-A關係(extends,implements)是繼承關係,HAS-A是使用關係\
    • 一個類別只能繼承一個父類別
  • 多型
    • 通過不只一個IS-A關係的就被認為是多型的
    • 除了Object以外,所有Java物件都是多型的
    • 你可以使用一個較通用的參考變數型別(一個父類別或介面)來指涉到一個物件。但在執行時期,會根據真實物件來做動態選擇的只有實體函式
    • 只有被覆寫的實體函式可以根據真實物件被動態的呼叫
  • 覆寫(Override)
    • 子類別必須實作父類別的抽象函式,除非子類別也是抽象的
    • 參數必須與原函式相同
    • 回傳型別必須相同,或是它的子型別
    • 存取等級可以更寬鬆(不可小於父類別方法)
    • 只有在實體函式被子類別繼承時才能被覆寫
    • 不可拋出新的可控式異常,可以拋出範圍更拘限的異常
    • 不能覆寫staticfinal函式
    • 執行時期決定哪一個覆寫函式被呼叫
  • 多載(Overload)
    • 必須變更參數
    • 可以變更回傳型別
    • 可以變更存取修飾子
    • 可以宣告新的或更廣的可控式異常
    • 可以在同一個類別或子類別多載函式
    • 編譯時期傳入的引數參考型別決定哪一個多載函式被呼叫
  • 轉型
    • 轉型有兩種:向下或向上
    • 向下:父類別參考變數指涉到子類別的物件,要指派給子類別參考時使用明確的向下轉型
    • 向上轉型:可以明確的或暗中地,將一個參考變數指派給父類別的參考變數。指派動作限制了新變數的存取能力
  • 實作
    • 實作介面就是正確地覆寫定義在介面的函式
    • 一個類別可以實作多個介面
    • 介面可以繼承介面,不能繼承類別
    • 介面不能實作介面或類別
  • 回傳型別
    • 物件參考可以接受null當作回傳值
    • 陣列可以被宣告成回傳型別或回傳值
    • 基本型別當成回傳型別,可以回傳任何能被暗中轉換成回傳型別的值
    • 物件當成回傳型別,可以回傳子型別的物件
    • 使用介面當成回傳型別的函式,可以回傳任何實作者
  • 建構子和實體化
    • 每一個類別以及抽象類別都至少一個建構子
    • 建構子沒有回傳型別
    • 執行方式:
      • 建構子呼叫父類別的建構子,父類別建構子在呼叫它的父類別建構子,一直下去直到Object的建構子
      • Object建構子執行並回傳子建構子,一直下去直到原先被呼叫的建構子,完畢,建立新的實體
    • 建構子可以用任何存取修飾子
    • 如果你的類別沒有建構子,系統預設一個沒有參數的預設建構子
    • 建構子第一行必須呼叫this()或是super()
    • 如果第一行沒有this()或super(),編譯器自動加上一行super()
    • 建構子執行完畢後,才能使用實體變數
    • 建構子不能被繼承,不能被覆寫
    • 建構子可以被其它建構子呼叫(使用super()或this())
    • 不能同時呼叫this()和super()
  • 靜態(Static)
    • 用於和物件無關的行為或屬性
    • static函式不能被覆寫,但可以被重新定義
  • 耦合
    • 一個類別知道,或使用,其他類別成員的程度
    • 鬆散耦合:將類別封裝的很好,彼此之間的參考減少到最低,並盡量使用API來互相溝通
  • 內聚力
    • 一個類別擁有單一的,定義精確的角色或責任
    • 高內聚力:一個類別成員支援單一的、定義精確的角色或責任。