為什麼要引入繼承? 還是做一個媒體庫,裡面可以放CD,可以放DVD。如果把CD和DVD做成兩個沒有聯繫的類的話,那麼在管理這個媒體庫的時候,要單獨做一個添加CD的函數,單獨做一個添加DVD的函數,如果還要往這個媒體庫里添加其他的媒體類,還要再創建另一個添加函數。我們說這樣的代碼不具備可擴展性。... ...
代碼參考:Java基礎學習小記--多態
- 為什麼要引入繼承?
還是做一個媒體庫,裡面可以放CD,可以放DVD。如果把CD和DVD做成兩個沒有聯繫的類的話,那麼在管理這個媒體庫的時候,要單獨做一個添加CD的函數,單獨做一個添加DVD的函數,如果還要往這個媒體庫里添加其他的媒體類,還要再創建另一個添加函數。我們說這樣的代碼不具備可擴展性。另外,CD和DVD有很多相似之處,它們的成員變數里都有標題,播放時長,評論,等等,我們稱這樣的程式存在大量的代碼複製,代碼複製是代碼不良的表現。所以我們可以創建一個它們的父類,把他們相同的成員變數都添加進父類,而它們都可以繼承得到這些變數,在添加到媒體庫的時候僅僅需要創建一個添加它們父類的這麼一個函數,它們便也可添加進去。
- 子類從父類那裡繼承得到了什麼?
繼承得到了父類所有的東西,包括成員變數和成員函數。但不見得能夠訪問父類的所有東西,這樣看父類所繼承下來的成員變數和成員函數的訪問屬性。如果父類里有成員變數是private的,那麼子類是不可以直接訪問的。但是,private只有父類自己可以訪問,所以我們可以在子類里通過調用父類的public函數來間接的訪問這些成員變數。
另外,子類除了有從父類那裡繼承得到的之外,還可以有自己的獨有的成員變數和函數,寫在自己的類裡面。
- 訪問屬性
訪問屬性 | 含義 |
public | 對所有人開放 |
private | 只有自己可以訪問 |
protected | 只有自己、子類和包內其他類可以訪問 |
預設 | 只有自己和包內其他類可以訪問 |
- super();
- 在父類的構造函數中構造過的成員變數,子類的構造函數的參數表裡要寫明,並且用super()將這些在父類那裡構造過的成員變數從父類那裡取過來。實例代碼請看多態那篇博文。
- super();裡面的參數會決定調用父類里的哪個構造器,super();裡面的參數和所調用的構造器的參數是相同的。
- 預設模式下(如果子類構造器里沒有super();),會預設調用父類里沒有參數的構造器,如果父類里沒有這樣的構造器,eclipse會報錯。
- 覆蓋(override)
當子類和父類里有相同名稱的函數時,子類里的函數會去覆蓋(override)從父類那裡繼承來的那個同名函數,於是從父類來的那個函數就會隱藏起來不起作用。但是如果想在子類中調用父類中的那個同名函數,應寫成 super.函數名(); 。