一、接口的概念和基本特征
在Java語言中,接口有兩種意思:
一是指概念性的接口,即指系統對外提供的所有服務。類的所有能被外部使用者通路的方法構成了類的接口。
二是指用interface關鍵字定義的實實在在的接口,也成為接口類型。它用于明确的描述系統對外提供的所有服務,能夠更加清晰的把系統的實作細節與接口分離。
接口對其成員變量和方法做了許多限制。接口的特征歸納如下:
(1)接口中的成員變量和變量預設都是public、static、final類型的,必須被顯示初始化。
(2)接口中的方法預設都是public、abstract類型的。
(3)接口中隻能包含public、static、final類型的成員變量和public、abstract類型的成員方法。
(4)接口沒有構造方法,不能别執行個體化。
(5)一個接口不能實作另一個接口,但它可以繼承多個其他接口。
(6)接口必須通過類來實作它的抽象方法。
(7)與子類繼承抽象父類相似,當類實作了某個接口時,它必須實作接口中所有的抽象方法,否則這個類必須被定義為抽象類。
(8)不允許建立接口的執行個體,但允許定義接口類型的引用變量,該變量引用實作了這個接口的類的執行個體。
(9)一個類隻能繼承一個直接的父類,但能實作多個接口。
二、比較抽象類與接口
抽象類與接口都位于繼承樹的上層。它們具有一下相同點:
(1)代表系統的抽象層。
(2)都不能被執行個體化。
(3)都能包含抽象方法。
抽象類和接口主要有兩大差別:
(1)在抽象類中可以為部分方法提供預設的實作,進而避免在子類中重複實作它們,提高代碼的可重用性,這是抽象類的優勢所在;而接口中隻能包含抽象方法。
由于抽象類中允許加入具體的方法(即非抽象方法),是以擴充抽象類的功能,即向抽象類中添加一個具體的方法,不會對它的子類造成影響;而對于接口,一旦接口被公布,就必須非常穩定,因為随意在接口中添加抽象方法,會影響到所有的實作類,這些實作類要麼實作新增的抽象方法,要麼聲明為抽象類。
(2)一個類隻能繼承一個直接的父類,這個父類有可能是抽象類;但一個類可以實作多個接口,這是接口的優勢所在。
為了簡化系統結構和動态綁定機制,Java語言禁止多繼承。借助接口,可以友善地對已經存在的系統進行自下而上的抽象。對于任意兩個類,不管它們是否屬于同一個父類,隻要它們存在着相同的功能,就能從中抽象出一個接口類型。接口中定義了系統對外提供的一組相關的服務,接口并不強迫它的實作類在語義上是同一種類型。
綜上所述,接口和抽象類各有優缺點,開發人員應該揚長避短,發揮接口和抽象類各自的長處。使用接口和抽象類的總的原則如下:
(1)用接口作為系統與外界互動的視窗。站在外界使用者的角度,接口向使用者承諾系統能提供哪些服務;站在系統本身角度,接口指定系統必須實作哪些服務。接口是系統中最高層次的抽象類型。
(2)由于外界使用者依賴系統的接口,并且系統内部會實作接口,是以接口本身必須十分穩定,接口一旦制定,就不允許随意修改,否則會對外界使用者及系統内部都造成影響。
(3)用抽象類來制定系統中的擴充點。可以把抽象類看做介于“抽象”和“實作”之間的半成品,抽象類力所能及的完成了部分實作,但該有一些功能有待于它的子類去實作。
三、與接口相關的設計模式