繼承與多態
瞭解繼承
繼承的關係意味着子類繼承了父類的實例變量和方法。
父類比較抽象,子類比較具體。web
繼承層次的設計
- 找出具備共同屬性和行爲的對象(用繼承來防止子類中出現重複的程序代碼)
- 設計表明共同狀態與行爲的類
- 決定子類是否須要讓某項行爲(也就是方法的實現)有特定不一樣的運行方式,即方法由子類覆蓋
- 經過尋找使用共同行爲的子類來找出更多抽象化的機會。
「是一個」與」有一個」
當一個類繼承自另一個類時,咱們會說這是子類去繼承父類。若你想要知道某物是否應該要繼承另外一物時,則能夠用is-a測試來檢驗。
is-a測試適用在繼承層次的任何地方。若是你的繼承層次樹設計得很好,那麼多有的子類都應該經過任意個上層父類的IS-A測試。
若是類Y是繼承自類X,且類Y是類Z的父類,那麼Z應該可以經過IS-A X的測試。安全
子類能繼承下來哪些東西?
4種權限:private default protected public
存取權限(access level)控制了誰能夠接觸什麼。測試
public類型的成員會被繼承
private類型的成員不會被繼承設計
要點:
- 子類是extends父類出來的
- 子類會繼承父類全部public類型的實例變量和方法,但不會繼承父類全部private類型的變量和方法
- 繼承下來的方法能夠被覆蓋掉,但實例變量不會被覆蓋掉
- 使用is-a測試來驗證繼承結構的合理性
- is-a關係是單方向的。河馬是動物,但動物不必定是河馬
- 當某個方法在子類中被覆蓋過,調用這個方法會調用到覆蓋過的版本
- 若是類Y是extends類X,且類Y是類Z的父類,則Z應該能經過IS-A X的測試。
繼承的意義
經過設計繼承的過程累積面向對象的經驗值。
經過提取出一組類間共同的抽象性,可以排除掉重複的程序代碼而將這個部分放在父類,如此一來,若是有共同的部分須要修改,那麼就只需改一個地方,不須要動子類。code
多態
多態下,引用類型與對象能夠是不一樣的類型
運用多態時,引用類型能夠是實際對象類型的父類
參數和返回類型也能夠多態,若是方法參數聲明爲父類類型,那麼在運行時能夠傳入任何的子類對象。對象
問題
你可以繼承任何一個類麼?就像類的成員同樣若是類是私有的你就不能繼承?
有三種方法能夠防止某個類被做爲子類
第一種是存取控制:就算類不能標記爲私有的,但它仍是能夠不標記公有。非公有的類只能被同一個包的類做出子類。
第二種是使用final這個修飾符,這表示它是繼承的末端,不能被繼承
第三種是讓類只擁有private的構造程序
爲何會作出標識final的類,這樣有什麼好處?
通常來講,不會標識final,但若是須要安全-確保方法都是你寫的版本,此時就須要final
可不能夠只用final去標識方法而不是用整個類
若是想防止特定的方法被覆蓋,能夠將該方法標識上final這個修飾符,將整個類標識爲final表示沒有任何的方法能夠被覆蓋繼承
覆蓋的規則
- 參數必需要同樣,且返回類型必需要兼容
- 不能下降方法的存取權限:存取權限必須相同,或者更爲開放。
方法的重載(overload)
重載的意義是兩個方法的名稱相同,但參數不一樣,因此重載與多態毫無關係ci
重載版的方法只是恰好有相同名字的不一樣方法,它與繼承或多態無關,重載的方法與覆蓋方法不同。it
- 返回類型能夠不一樣
- 不能只改變返回類型
- 能夠更改存取權限