黃階低級 - 《 Java 核心》- 5.1 類、超類和子類(三) - 修改 1 次

1、繼承層次

在繼承層析中,從某個特定類到其祖先的路徑成爲該類的繼承鏈

由於 Java 的單繼承機制,我猜想一個類的繼承鏈是唯一的,但這一點我還沒有找到明確地答案,有大神可以告訴我。

2、多態

有一個用來判斷是否應該設計爲繼承關係的簡單原則,就是 is-a 原則

例如,每個經理都是僱員,將 Manager 類設計爲 Employee 類的子類的顯而易見的 。

Java實現多態有三個必要條件:

  1. 繼承、重寫、向上轉型。
  2. 繼承:在多態中必須存在有繼承關係的子類和父類。
  3. 重寫:子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。

3、動態綁定

瞭解調用對象方法的執行過程十分重要,下面是執行過程:

第一步:假設調用 x.f(param) ,且隱式參數 x 聲明爲 C 類的對象。編譯器將會一一列舉所有 C 類中名爲 f 的方法和其超類中名爲 f 的且訪問屬性爲 public 的方法

第二步:編譯器將進行參數類型匹配,這個過程就要重載解析,若有完全匹配的就選這個方法,沒有的話匹配允許類型轉換的方法,比如 int 可以轉換成 double ,如果這樣還是不能找到匹配項,編譯器就會報錯;同時如果找到多於一個匹配項,編譯器也會報錯。

靜態綁定和動態綁定的區別:
如果是 private,static,final 方法或者構造器,那麼編譯器可以明確地知道該調用哪個方法,這種調用方式成爲靜態綁定;與此對應的是,調用依賴於隱式參數的實際類型,並且在運行中實現動態綁定。

深入:每次調用方法都要進行搜索,時間開銷相當大,因此,虛擬機預先爲每個類創建了一個方法表,裏面列出了所有方法的簽名和實際調用的方法。

注意:在覆蓋一個方法時,子類方法不能低於父類方法的可見性。

4、阻止繼承: final 類和方法

不允許擴展的類稱爲 final 類, final 類中的所有方法自動地成爲 final 方法,但不包括域,域不會自動成爲 final

深入:如果一個方法沒有被覆蓋並且很短,編譯器就能夠進行內聯

5、抽象類

爲什麼要花力氣進行高層次的抽象呢?可以使用共性,提取交集,減少重複,明確 is-a 關係等,不然要爲每一個對象建立一套完整的體系。

注意:抽象類和 final 類不同,其中的方法不會自動定義爲抽象方法,與之相反,有抽象方法的類一定要聲明爲抽象類。

個人記憶:抽象類,Person類,抽象方法,具體數據和具體方法,父類可以比子類更抽象,提出一個概念讓子類去實現。

沒有完全把父類的抽象方法實現的子類還是抽象類;當然如果爲了不把當前類作爲實例類,也大可聲明爲抽象類,這樣別人就不能實例化該類了。

6、受保護訪問

爲了給子類使用父類的屬性和方法而不給其他包的類用,可以使用 protected

這種方法一個最好的實例就是 Object 類的 clone 方法,後續再介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章