看了一下java tutorial里面對接口的定義,底下附1:借口是抽取相互之間沒有關系的類的共同特征,而不用去關注類之間的關系。
我覺得這個是借口和抽象類最關鍵的區別,接口是希望一組沒有層次關系的類之間可以擁有共同的行為,而抽象類作為父類的話,自然希望其子類在邏輯上和父類是有一定的關系的。比如說一個抽象類,bird,里面有fly這個方法。我們現在想設計一架飛機也可以飛,雖然我們可以讓plane這個類繼承bird這個抽象類,但是這兩個完全是風馬牛不相及的東西,自然不應該有繼承關系了。但如果是接口設計的話,我們可以設計出一個flyable的接口,里面定義fly的方法,因為bird和plane都可以飛,所以我們可以讓鳥和飛機類去implement這個flyable的接口,然后各自實現不同的fly的方法。
java tutorial還有一個例子,比如說商店有若干種商品,各種商品之間一般不會有什么繼承關系,但是現在店主希望管理各種商品,所以店主希望所有的商品都實現一種可以稱為manageable的接口,里面包含用于管理的一些方法和屬性,如價格、索引號這樣的屬性或者設置零售價格這樣的方法。這樣接口就巧妙的將各種不相關的類聯系起來了。如果各種各樣的商品類implement了manageable接口,那么店主只需要面向manageable這個接口就可以管理各種商品了,而不需要考慮各種商品之間是否有什么層次關系。所以接口給編程以極大的靈活性,而常說的面向接口編程大概是這個意思吧。
Java中還有一些常用街口,比如說comparable接口,任何類只要實現了這個接口,都可以被compare。(好像是這樣,不確定,有錯請指出)。Java中還有什么比較常用的接口呢?
附2、4個人感覺都是基于1的。不過附3,看不太懂,是什么意思。附4講到了可以通過接口實現多重繼承,不過個人感覺接口志不在此,只是在語法上達到了這樣的效果(編程經驗不豐富,所以想當然這么認為,大家指正一下)
總結一下,抽象類是一種類是對一組具有相同屬性和方法的邏輯上有關系的事物的一種抽象。而接口則是對一組具有相同屬性和方法的邏輯上不相關的事物的一種抽象。
附:You use an interface to define a protocol of behavior that can be implemented by any class anywhere in the class hierarchy. Interfaces are useful for the following:
1.Capturing similarities among unrelated classes without artificially forcing a class relationship
2.Declaring methods that one or more classes are expected to implement
3.Revealing an object's programming interface without revealing its class
4.Modeling multiple inheritance, a feature of some object-oriented languages that allows a class to have more than one superclass