標籤:引用 方式 父類 存在 通過 讀取 相同 結構 關係
物件導向的編程允許從已經存在的類中定義新的類,這稱為繼承。
面向過程的範式重點在於方法的設計,而物件導向的範式將資料和方法結合在對象中。物件導向範式的軟體設計著重於對象以及對象上的操作。物件導向的方法結合了面向過程範式的強大之處,並且進一步將資料和操作整合在對象中。
繼承可以使得你可以定義一個通用的類(即父類),之後擴充該類為一個更加特定的類(即子類)。在Java術語中,如果類C1擴充自另一個類C2,那麼就將C1稱為次類,將C2稱為超類。 超類也稱為父類或基類,次類又稱為子類、拓展類或衍生類別。
子類從它的父類中繼承可訪問的資料域和方法,還可以添加新資料域和新方法。
如果父類中有私人的資料域,這個類被繼承後,父類中的私人資料域是不能被子類訪問的,唯一能讀取和改變它們的方法就是通過它們的get和set方法。
和傳統的理解不同,子類並不是父類的一個子集。實際上,一個子類通常比它的父類包含更多的資訊和方法。
父類中的私人資料域在該類之外是不可訪問的。因此,不能在子類中直接使用。但是,如果父類中定義了公用的訪問器/修改器方法,那麼可以通過這些公用的訪問器/修改器來訪問和修改它們。
不是所有的“是一種”關係都該用繼承來建模。繼承是用來為“是一種”關係建模的。不要僅僅為了重用方法這個原因而盲目地擴充一個類。
某些程式設計語言是允許從幾個類派生出一個子類的。這種能力成為多重繼承。但是在Java中是不允許多重繼承的。一個Java類只可能直接繼承自一個父類。這種限制稱為單一繼承。如果使用extends關鍵字來定義一個子類,它只允許有一個父類。然而,多重繼承是可以通過介面來實現的。
關鍵字super指代父類,可以用於調用父類中的普通方法和構造方法。
構造方法用於構建一個類的執行個體。不同於屬性和普通方法,父類的構造方法不會被子類繼承。它們只能使用關鍵字super從子類的構造方法中調用。調用父類構造方法的文法是:super(),或者super(parameters);語句super()調用父類的無參構造方法,而語句super(arguments)調用與參數匹配的父類的構造方法。語句super()和super(arguments)必須出現在子類構造方法的第一行,這是顯示調用父類構造方法的唯一方式。
要調用父類的構造方法就必須使用關鍵字super,而且這個調用必須是構造方法的第一條語句。在子類中調用父類構造方法的名字會引起一個語法錯誤。
構造方法可以調用重載的構造方法或父類的構造方法。如果它們都沒有被顯示地調用,編譯器就會自動地將super()作為構造方法的第一條語句。
子類必須使用super調用父類的構造方法,如果沒有顯示調用的話,就會使用super(),調用父類不帶參數的構造方法,如果父類沒有不帶參數的構造方法,則必須顯示地用帶參數的super(parameters)調用父類的構造方法。
一般情況下,最好能為每個類提供一個無參構造方法,以便於對該類進行擴充,同時避免錯誤。
在任何情況下,構造一個類的執行個體時,將會調用沿著繼承鏈的所有父類的構造方法。當構造一個子類的對象時,子類構造方法會在完成自己的任務之前,首先調用它的父類的構造方法。如果父類繼承自其他類,那麼父類構造方法又會在完成自己的任務之前,調用它自己的父類的構造方法。這個過程持續到沿著這個繼承體繫結構的最後一個構造方法被調用為止。這就是構造方法鏈。
關鍵字super不僅可以引用父類的構造方法,還可以引用父類的方法。
子類從父類中繼承方法。有時,子類需要修改父類中定義的方法的實現,這稱作方法重寫。
方法重寫:要重寫一個方法,需要在子類中使用和父類一樣的簽名以及一樣的傳回值類型來對該方法進行定義。
僅當執行個體方法是可訪問的,它才能被覆蓋。因為私人方法在它本身以外是不能訪問的,所以它不能被覆蓋。如果子類中定義的方法在父類中是私人的,那麼這兩個方法完全沒有關係。
與執行個體方法一樣,靜態方法也能被繼承。但是,靜態方法不能被覆蓋。如果父類中定義的靜態方法在子類中被重新定義,那麼在父類中定義的靜態方法將被隱藏。可以使用文法:父類名.靜態方法名調用隱藏的靜態方法。
重載意味著使用同樣的名字但是不同的簽名來定義多個方法。重載意味著在子類中提供一個對方法的新的實現。
方法重寫發生在通過繼承而相關的不同類中;方法重載可以發生在同一個類中。也可以發生在由於繼承而相關的不同類中。
方法重寫具有同樣的簽名和傳回值類型;方法重載具有相同的名字,但是不同的參數列表。
重載方法使得可以使用同樣的名字來定義不同方法,只要它們的簽名是不同的。(方法名和參數列表共同構成方法簽名,這裡方法名相同,則重載方法要求參數列表不同。)
被重載的方法必須具有不同的參數列表。不能基於不同修飾符或傳回值類型來重載方法。
---恢複內容結束---
Java基礎——繼承和多態