標籤:
最近一直在悶頭往前看《thingking in java》 ,但是卻由於趕了進度而忘記了初衷。當學到集合的時候,回頭卻發現,我連最基本的介面都不明白。查了一上午資料,現在明白例如一點點,寫個備忘錄吧,供以後修改和查看。
介面是什嗎?
我覺著《thingking in java》中的定義非常好,所謂介面,就是一個更高層次上的抽象,通過關鍵字interface產生一個完全抽象的類,不提供任何實現,只提供形式。這就類似於是一種協議,一種標準,“所有實現了該介面的類看起來都是這個樣子”。
介面有哪些作用?
- 實現多重繼承,或者說是實現偽多重繼承,因為java是單根繼承,只能通過實現多個介面來類比C++中的多重繼承。一個類通過向上轉型成不同的介面,來實作類別似於多重繼承一樣的特性(以及由此帶來的靈活性)。
- 降低耦合度,或者說實現完全解耦(當然真正的完全解耦是做不到的),提高代碼的複用性。 比如,如果某個方法操作的是某個類而非介面,那麼這個方法只能使用這個類及其子類,而往往一個方法只會使用到一個類的某一個特性,而其他不在這個類繼承體系內但也具有相似特性的類就不能被這個方法所使用。 而介面則完全克服了這個弊端,只要是實現了我的介面,就可以被這個方法調用。代碼就不寫了,我覺著《thingking in java》中所舉出的例子非常好。
- 由前兩點就可以引出不算第三點的第三點,介面的作用是一種標準,一種約束,通過介面,可以實現邏輯和具體實現分離。我們在使用介面的時候,可以不用關心具體的實現,因為只要是遵循我們介面的具體實現都可以使用。比如,java的JDBC和java web的那一系列的介面,sun公司定義了一套完整的JDBC介面,供廠商去實現,而資料庫試用者則完全不需要瞭解某個具體的資料庫產品是如何?的,只要調用JDBC介面就好了;當我們的資料庫更換時,只要改變一下所要載入的驅動就好了,而無需改變程式中的其他部分,降低了邏輯與具體實現的耦合度,從而提升了代碼的複用性。java web也是如此,開發人員按照介面去實現自己的軟體,而tomcat卻無需知道你是如何?的,只要調用相應的介面就能調用不同的servlet(這些都是個人的想法,不一定完全正確)
如何在正確的地方中使用介面和抽象類別?
說實話,如何正確使用介面和抽象類別,還有繼承組合等等這些,需要大量的代碼積累和經驗的總結。而我目前只是個學生,從入學到現在寫的java代碼總行數不超過5w行,寫這個完全是為了今後能夠慢慢地積累,沒有任何的經驗只談。
介面個人覺著就是具有某種功能對象集合的抽象,強調的是功能上的一致。而抽象類別則是某一種對象的抽象,強調的是種類上的一致。比如flyable介面就是對具有fly功能對象的一種抽象,如果定義成flyable抽象類別,就感覺有些不恰當,畢竟飛機,飛鳥,飛魚不是同一種對象,而他們之間相同的僅僅是fly這一種功能。抽象類別和類一樣,是某一種對象,這個對象一定具有某些屬性,而不同子類具有不同的表象而已,比如不同地區的人,大家都是人對象,只是所處的地方不同,將這些人抽象出來,就是一個抽象人類。如果把這個抽象的人類定義成一個介面,讓不同地方的人實現這個介面,那麼一些共性的方法或者特點就要多次重寫,這與物件導向的思想相違背(具體是哪一種實在是想不起來了)。
說到底,介面和抽象類別之間的區別就是 介面是一種“is like”的關係,而抽象類別是一種“is a”的關係。
更加深層次的想法,暫時是想不到了,日後一點一點積累吧。
《thinking in java》中有一段話感覺簡單而直接:
如果要建立不帶任何方法定義和成員變數的基類,那麼就應該選擇介面而不是抽象類別. 事實上, 如果知道某事物應該成為一個基類, 那麼第一選擇是使它成為介面
任何的抽象性都應該是應真正的需求而產生的。當必須的時候,應該重構介面而不是到處添加額外層級的間接性。
恰當的原則應該是優先選擇類而不是介面。從類開始,如果介面的必須性變得非常明確,那麼就應該進行重構。
//大家介面的討論 :http://bbs.csdn.net/topics/390200240
//介面和抽象類別之間的區別:http://dev.yesky.com/436/7581936.shtml#pl
//thinking in java筆記,如果有不對的地方,還望指正^_^
java介面的一些想法