抽象類和接口的區別、爲什麼用抽象類。

轉自:http://blog.csdn.net/wusuopubupt/article/details/8688219

網上再學習了一次,在這裏記下看到各位大蝦的金言。 
一、抽象類: 

在面向對象領域,抽象類主要用來進行類型隱藏(看本段最後一句例子)。那什麼是類型隱藏呢?我們可以構造出一個固定的一組行爲的抽象描述,但是這組行爲卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現爲所有可能的派生類。好比:動物是一個抽象類,人、猴子、老虎就是具體實現的派生類,我們就可以用動物類型來隱藏人、猴子和老虎的類型。( 參考doSome方法)

二、接口: 

接口是什麼呢?

Java接口:是一系列方法的聲明,是一些方法特徵的集合,一個接口只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行爲(功能)。接口是一種特殊形式的抽象類。

三、抽象類和接口的區別: 

首先,抽象類在Java語言中表示的是一種繼承關係,一個類只能使用一次繼承關係;但是,一個類卻可以實現多個接口。也許,這是Java語言的設計者在考慮Java對於多重繼承的支持方面的一種折中考慮吧。 其次,在抽象類的定義中,我們可以賦予方法的默認行爲。但是在接口的定義中,方法卻不能擁有默認行爲,爲了繞過這個限制,必須使用委託,但是這會 增加一些複雜性,有時會造成很大的麻煩。

 抽象類在Java語言中體現了一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在”is a”關係,即父類和派生類在概念本質上應該是相同的。對於接口來說則不然,並不要求接口的實現者和接口定義在概念本質上是一致的,僅僅是實現了接口定義的契約而已。接口表示的是”like a”關係。 使用抽象類來定義允許多個實現的類型,比使用接口有一個明顯的優勢:抽象類的演化比接口的演化要容易的多。在後續的發行版中,如果希望在抽象類中增加一個方法,只增加一個默認的合理的實現即可,抽象類的所有實現都自動提供了這個新的方法。對於接口,這是行不通的。雖然可以在骨架實現類中增加一方法的實現來解決部分問題,但這不能解決不從骨架實現類繼承的接口實現的問題。由此,設計公有的接口要非常謹慎,一旦一個接口被公開且被廣泛實現,對它進行修改將是不可能的。 所以,使用接口還是抽象類,取決於我們對問題的概念的本質理解和設計的意圖。 

    Java接口與抽象類的相同點: 
       1. 都不能被實例化。 
       2. 都能包含抽象方法。 
抽象類與接口緊密相關。然接口又比抽象類更抽象,這主要體現在它們的差別上:1)類可以實現無限個接口,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實現接口,從而得出接口是用來解決多重繼承問題的。2)抽象類當中可以存在非抽象的方法,可接口不能且它裏面的方法只是一個聲名必須用public來修飾沒有具體實現的方法。3)抽象類中的成員變量可以被不同的修飾符來修飾,可接口中的成員變量默認的都是靜態常量(static fainl)。4)這一點也是最重要的一點本質的一點"抽象類是對象的抽象,然接口是一種行爲規範"。 
例如每個接口可以代表一種最頂層的抽象,可以理解爲代表一類東西,如果一個類實現了多個接口,那這個類就有了多種類型,即接口是定義混合類型的理想工具最後:有一種設計模式,就是,默認適配模式,意思就是說,首先定義一個接口,通過抽象類實現這個接口,並實現一些子類不需要一定實現的方法,然後,子類就可以選擇是繼承接口,實現所有方法,還是直接繼承這個抽象類實現具體需要的方法, 

四、爲什麼用抽象類

	定義成抽象類是爲了以後要其子類來繼承的,因爲父類裏有很多方法是無法定義具體的實現的,只能定義一個原型,讓子類來分別實現!所以要定義成抽象的!
簡單來說就是
抽象類是在接口和實體類之間的一個橋樑 
例如 
做一個接口叫做飛行FlyAnimalAction,裏面定義一個方法叫做flying,再定義一個方法叫做eat 
做一個類叫做蚊子實現接口,蚊子要實現flying方法,實現自己的eat方法 
做一個類叫做蒼蠅實現接口,蒼蠅也要實現flying方法,實現自己的eat方法 
你發現所有會飛的動物都要實現這個接口,很麻煩,不如 
做一個抽象類FlyAnimal,然後實現上面的接口 
在裏面實現flying這個方法,因爲大部分的飛行動作是一樣的,而eat方法則繼續寫成抽象方法,因爲大部分的動物吃東西是不一樣的 
下面你再寫蚊子類就簡單了,可以直接繼承這個抽象類,然後實現自己的吃方法就行了 
而且蒼蠅類的製作也是一樣,這個時候抽象類的功能就顯示出來了,當然抽象類的功能遠遠不是這些,只是初期理解到這裏就夠了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章