第八章 多型

2020-10-11 01:00:29


在這裡插入圖片描述

1.向上轉型
  • 把對某個物件的參照視為對基本類型的的參照(例如:Wind繼承於Instrument,在需要傳遞Instrument型別的時候,也可以傳遞Wind物件代替)
2.轉機
  1. 方法呼叫繫結

    (1) 將一個方法呼叫同一個方法體關聯起來

    (2) 前期繫結

    在程式執行前進行繫結(static、final)

    (3) 後期繫結(動態繫結/執行時繫結)

    在程式執行時根據物件型別進行繫結

  2. 產生正確行為

    (1) 發訊息給某個物件,讓物件去判斷該做什麼

    (2) 在編譯時,編譯器不需要獲得任何特殊資訊就能進行正確呼叫

  3. 可拓展性

    (1) 只與及類介面通訊,這樣的程式是可拓展的,因為可以從通用的基礎類別繼承出新的資料型別,從而新添一些新功能

    (2) 多型:將新改變的事物和未被改變的事物分離開

  4. 缺陷:「覆蓋」私有方法

    (1) 只有非private的方法才可以被覆蓋

    (2) 如果匯出類有一個方法與基礎類別private方法同名,則匯出類中的方法被視為一個「新的方法」,並不是覆蓋基礎類別同名private方法

  5. 缺陷:域和靜態方法

    (1) 任何與存取都將由編譯器解析,因此不是多型

    (2) 靜態方法是與類關聯的,並非與單個物件相關聯,所以某個方法是靜態的,他的行為就不是多型性

3.構造器和多型
  1. 構造器的呼叫順序

    (1) 呼叫基礎類別構造器
    (2) 按宣告順序呼叫成員初始化方法
    (3) 呼叫匯出類構造器主體

  2. 繼承與清理

    (1) 某個子物件要依賴於其他物件,銷燬順序應該和初始化順序相反
    (2) 首先清理匯出類,再清理基礎類別(因為匯出類中的某些構建依賴於基礎類別,所以要讓基礎類別中的構建在匯出類銷燬前依然起作用)
    (3) 如果成員物件中存在於其他一個或多個物件啊你個共用的情況就必須使用「參照計數」來跟蹤仍舊存取這共用物件數量

  3. 構造器內部的多型方法的行為

    (1) 初始化
    i.在其他任何事物沒有發生之前,將分配給物件的儲存空間初始化為零
    ii.呼叫基礎類別構造器
    iii.按照宣告的順序呼叫成員初始化方法
    iv.呼叫匯出類構造器主體

    (2) 用盡可能簡單的方法使物件進入正常狀態,儘量避免呼叫其他方法

    (3) 在構造器中呼叫的唯一方法就是final方法(final方法不能被複寫)

4.協變返回型別
  • 基礎類別被匯出類覆蓋的方法,返回型別可以是:基礎類別方法的放回型別的匯出型別
5.用繼承進行設計
  1. 用繼承表達行為之間的差異,並用欄位表狀態上的變化
  2. 純繼承與拓展

    (1) 只有在基礎類別中已經建立的方法才能在匯出類中被覆蓋
    (2) 也可以認為是一種純替代
    (3) 基礎類別可以接收任何傳送給匯出類的訊息,因為兩者介面相同
    (4) 匯出類中,拓展介面不能被基礎類別存取,因此一旦「向上轉型」就不能呼叫新方法

  3. 向下轉型與執行時型別識別

    (1) 在繼承層次中向下移動【強制型別轉換(因為匯出類的型別就是基礎類別所以需要強制型別轉換)為匯出類,從而控制匯出類有而基礎類別沒有的方法】
    (2) 如果型別錯誤,會報錯ClassCastException