初探設計:Java繼承什麼時候用?怎麼用?

Writer      :BYSocket(泥沙磚瓦漿木匠) git

1、回顧繼承

常見的以下: github

一、依賴(」uses-a「) socket

二、聚合(」has-a「) ide

三、繼承(」is-a「)類之間關係 post

也就是UML類圖中常見的三種關係,另外常見的還有實現(接口與實現類的關係),組合等。 spa


繼承,即「is-a」關係,是一種表示特殊與通常的關係。好比,女人(特殊)是一我的(通常)。關鍵字extends代表正在構造的新類派生於一個存在的類。 設計

一、已經存在的類稱爲 超類父類或者基類 對象

二、新類被稱爲 子類或者派生類 繼承


有時候看着人家源碼的設計。好比常見的接口,緊接着抽象類實現接口,而後繼承該抽象類的各類實現: 接口

image

通常都是這樣的,行爲總則都寫着頂層接口抽象類實現了下面各個實現類公用的方法和字段實現類各自實現功能

但裏面這些究竟怎麼用呢?好比繼承在什麼前提下使用,什麼場景前提下,下面就是思考後的小結:(Think , Write & Do)

2、繼承什麼時候用?怎麼用

也就是說,繼承設計使用的時候,有哪些技巧,有哪些須要注意的地方。

一、公共的方法和字段才放在基類(也就是父類)

這句話可能有爭議,太過於吹毛求茲或者是嚴格。拿女人和人的問題來講,好比名字字段、age均可以放在基類人上面,但女人的那些第二特徵就是獨有了。

但有些時候的例子老是很疑惑:好比Java工程師實習生和Java工程師,看樣子能夠「實習生」extends 「Java工程師」,而後不少Java工程師上的字段都是不屬於Java實習生的。顧二者並無上面太大關係,可能都是從屬於一個父類—工程師。下面類關 系圖纔是正確的:

image

子類對父類的繼承是包括了父類的公有和受保護的方法和字段。但子類只須要繼承父類的一部分,就沒轍了。這時候記住一句話:「多用組合,少用繼承」。

二、protect並不能保護父類

其實protect機制在父類並不能起到好的保護。子類能夠在須要的的時候訪問父類。可是繼承無限制,即子類的子類… 無止境的。若是想侵入父類protect方法,只須要寫個類,繼承任意子類就可訪問。兩者,同一個包下能訪問。

從上面也能夠總結出:

三、在繼承父類的方法與字段都有意義的時候,選擇繼承。不然,不要使用繼承。

四、在覆蓋子類中的方法時,不要偏離最初的設計方法。

父類的方法實現或者定義都是指定了一種行爲的內涵。因此繼承父類的時候,有個重寫override)方法能夠改變子類的行爲。但請不要改變其定義的內涵。源碼中常見的有:好比 IO 中的 read write方法和Servlet中 的 get post。

五、繼承與組合、多態

繼承,子類與父類在編譯期就能肯定其對象。而組合或者是多態,在運行期就才能肯定其對象,相比之下,組合多態達到了更多的靈活性。但,運行期未知的錯誤是要注意處理的。

顧,「多用組合,少用繼承」。

3、本文小結

繼承的一點一滴。泥瓦匠,這軟文小結,不免有錯誤。歡迎指正討論。

歡迎點擊個人博客及GitHub — 博客提供RSS訂閱哦!

———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

7066956_21002167761444703497_thumb

相關文章
相關標籤/搜索