閱讀404 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

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

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

一、回顧繼承

常見的如下:

1、依賴(”uses-a“)

2、聚合(”has-a“)

3、繼承(”is-a“)類之間關係

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

繼承,即“is-a”關係,是一種表示特殊與一般的關係。比如,女人(特殊)是一個人(一般)。關鍵字extends表明正在構造的新類派生於一個存在的類。

1、已經存在的類稱為 超類父類或者基類

2、新類被稱為 子類或者派生類

 

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

image

一般都是這樣的,行為總則都寫著頂層接口抽象類實現了下麵各個實現類公用的方法和字段實現類各自實現功能

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

二、繼承何時用?怎麼用

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

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

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

但有些時候的例子總是很疑惑:比如Java工程師實習生和Java工程師,看樣子可以“實習生”extends “Java工程師”,然後很多Java工程師上的字段都是不屬於Java實習生的。顧兩者並沒有上麵太大關係,可能都是從屬於一個父類—工程師。下麵類關係圖才是正確的:

image

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

2、protect並不能保護父類

其實protect機製在父類並不能起到好的保護。子類可以在需要的的時候訪問父類。但是繼承無限製,即子類的子類… 無止境的。如果想侵入父類protect方法,隻需要寫個類,繼承任意子類就可訪問。二者,同一個包下能訪問。

從上麵也可以總結出:

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

4、在覆蓋父類中的行為(方法)時,不要偏離最初的設計內涵。

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

5、繼承與組合、多態

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

顧,“多用組合,少用繼承”。

三、本文小結

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

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

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

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

最後更新:2017-05-22 10:02:41

  上一篇:go  阿裏感悟(十四)-如何帶新員工
  下一篇:go  阿裏感悟係列文章