介面

介面與類別的不同處在於介面本身並不提供功能的實作,而只具有類別的架構,利用介面可以分離類別的功能面與架構面,利用介面描述類別所提供的功能架構,而實際的功能實作則由類別去完成,所以說介面就等於抽像的類別。介面在程式設計中並非必要的做法,其實就算程式完全沒沒有使用介面也都能夠設計完成,甚至使用了介面反而必須費神分析該從類別中抽離出那些介面,並需額外撰寫關於介面處理的程式碼,即然如此那為何又會有介面的存在呢?的確一切都用具體類別就能快速的解決與完成程式的問題是相當的方便,但是,過度的依賴類別會使得類別與類別之間緊密的結合在一起,之後很難在將類別分開重新在利用於其他程式之中,導至之後撰寫程式一切都需重頭在來過一次。這也就是使用介面的好處之一,透過介面可以將類別的方法架構抽離出來,類別彼此之間透過介面互相結合,就像把類別當成零組件,只要有合適的地方就可以來出來再次利用。介面還有另一項主要的用途,可以使Java具有多重繼承的特性。Java並不像C/C++提供多重繼承的功能,但使用介面則沒這有這項限制,一個類別可以同時實作多個不同的介面,所以可以使用介面的觀念來達到多重繼承的需求。

或許讀者初次使用介面的觀念一時之間會難以適應,但只要有耐心養成使用介面撰寫程式的良好習慣,相信很快的就可以體驗到程式再利用所帶來的好處。

首先讓我們先看到介面的語法結構:

public interface 介面名稱{

介面的宣告與類別相當類似,類別使用的是class關鍵字,而介面使用的則是interface,關鍵字之後接的是介面的名稱,這裡與類別命名規則一樣,介面名稱必須於程式檔案名稱相同。介面裡所宣告的所有變數都將被自動冠上final關鍵字,因此介面中的變數皆為常數不允許被更動。介面中的方法皆為抽像的方法,並不會進行方法的實作,所以介面中所有的抽像方法宣告都是以雙引號 ; 做為結尾,例如:

public void test();

在介面中並不需要利用abstract修飾字,所有在介面中所宣告的方法會自動被視為抽像的,以下為一個簡單的介面宣告範例:

//Book.java 介面範例:

Book為一個關於書藉資料的介面,透過介面將一般書藉常見的資訊抽離出來,像是作者書本名稱、作者名稱、價格,任何只要有實作Book介面的程式就必須實介面中所宣告的方法。在撰寫完介面之後,必須於類別中使用implements關鍵字來宣告此類別所實作的介面,另外implements關鍵字後可以同時宣告多個介面,每個不同介面名稱之間需使用逗號方開,語法使用方式如下:

修飾詞 class 類別名 implements 介面名1, 介面名2, 介面名3{

底下為一個完整的介面範例程式

【介面範例程式】

//BookOne.java 實作Book介面
//BookTwo.java 實作Book介面
//BookMain.java 介面應用範例主程式

【執行結果】

介面範例執行結果

圖1-12 多型範例執行結果

在範例中,BookOne與BookTwo為兩個不同的類別,BookTwo在設定價格時,會自動將書本的價格打八折,另外兩者在顯示書藉資訊格式也略有不同,但兩個類別都同時實作Book介面,因此可以確定的是兩個類別一定會提供setInfo與getIfno這兩個函式。在主程式中BookOne與BookTwo物件雖然與Book無繼承的關係,但卻擁有界面實作的關係,所以可以自動的轉型為Book介面型別(因為Book所提供的函式一定能於實作的類別中呼叫成功),隨後的操作就都只認介面不認類別。利用介面可以不用費心去了解介面後面的實作方式為何,直接可以透過介面所提供函式進行操作,就如同範例中BookOne與BookTwo兩個物件對於Book介面實作的方式略有不同(如印出資訊的格式、與價格計算方式),但主程式中對於兩個物件的操作方式卻都是相同的(同樣呼叫setInfo與getInfo函式)。讀者可以自行設計其它實作Book介面的類別,替換掉原本的BookOne或BookTwo類別,且無需更動到主程式中函式對於Book的操作方式,就能另程式有不同的風格展現,這也就是利用介面將程式函式架構從實作面抽離的好處。