抽象類與普通類相比最大的特點是約定了子類的實現要求,但是抽象類存在單繼承侷限。如果要約定子類的實現要求並且避免單繼承侷限就需要使用接口。
1. 接口概念
接口就是一個抽象方法和全局常量的集合,使用interface關鍵字進行定義。
子類如果要想使用接口,那麼就必須使用implements關鍵字來實現接口,同時,一個子類可以實現多個接口,可以使用接口來實現多繼承的概念,這也是接口相較於抽象類最大的優點。
對於接口的子類(不是抽象類)必須覆寫接口中的全部抽象方法。隨後可以利用子類的向上轉型通過實例化子類來得到接口的實例化對象。即接口也體現出了多態性。
2. 接口的限制
接口中的抽象方法和全局變量,訪問權限只允許爲public。
在類中(普通類和抽象類),不寫訪問控制權限的屬性方法默認爲default包訪問權限,而在接口中,默認爲public,所以可以對接口中常量和方法的定義進行簡化,如下所示:
3. 接口的實現規則
當一個子類即需要實現接口又需要繼承抽象類時,請先使用extends繼承一個抽象類,而後使用implements實現多個接口,如下所示:
abstract interface A {}
abstract interface B {}
abstract class C {}
class D extends C implements A,B {}
抽象類也是類,所以使用抽象類可以實現多個接口,而且,實現接口的抽象類不用立即實現接口中的方法。
abstract interface A {}
abstract interface B {}
abstract class C implements A,B {}
接口和接口之間也存在着繼承關係,而且接口之間的繼承可以是多繼承。
abstract interface A {}
abstract interface B {}
abstract interface C extends A,B {}
接口中也可以存在一系列的內部結構,包括:內部普通類,內部接口,其中,使用static定義的內部接口就相當於外部接口。但是,在接口中定義這些結構時沒有意義的,我們使用接口是爲了利用它對子類行爲的規範,如果單純是想使用一個內部結構,直接創建對應的結果就行了。
4. 接口和抽象類的區別
接口和抽象類的非抽象類子類都必須立即實現所有的抽象方法,接口優於抽象類的地方在於接口不存在單繼承侷限.
除了單繼承的侷限之外,實際上使用抽象類和接口都是類似的。在實際開發中,抽象類的設計比接口複雜。
接口是Java的核心,慢慢會學到接口更多的使用與設計。
開發之中優先考慮接口,以避免單繼承侷限。
抽象類是模板,有層次感;接口則更關心行爲與混合。