天天看點

初探設計:Java繼承何時用?怎麼用?一、回顧繼承二、繼承何時用?怎麼用三、本文小結

常見的如下:

1、依賴(”uses-a“) 2、聚合(”has-a“) 3、繼承(”is-a“)類之間關系

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

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

1、已經存在的類稱為 超類、父類或者基類。 2、新類被稱為 子類或者派生類。

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

初探設計:Java繼承何時用?怎麼用?一、回顧繼承二、繼承何時用?怎麼用三、本文小結

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

但裡面這些究竟怎麼用呢?比如繼承在什麼前提下使用,什麼場景前提下,下面就是思考後的小結:(think , write & do)

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

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

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

初探設計:Java繼承何時用?怎麼用?一、回顧繼承二、繼承何時用?怎麼用三、本文小結

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

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

從上面也可以總結出:

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

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

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

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