国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

理解接口

2019-11-17 06:06:32
字體:
來源:轉載
供稿:網友

好的面向對象編程要求類設計人員隱藏那些不需要類的使用人員了解的信息。對于 java 編程語言,這樣的訪問可以通過使用要害字 PRivate, protected, 和 public來控制。這些要害字控制類內部的變量和方法是否可見,但是不好的類設計導致太多的可見信息和方法沒有被很好的封裝。

封裝的一種方式是通過使用接口(Interface)實現的。接口提供一種途徑,使類隱藏其處理的特定事物的細節,僅對外公布它必須支持的屬性。對于編程所涉及的,你可以修改類的實現,而不修改它的調用,因為屬性本身沒有改變,修改的僅僅是類的實現。

一個接口被經常用得到的地方是Collection Framework。這個框架定義了一組非常重要的接口,它們是由一組多個類實現的。通過僅僅研究主要的接口,你可以有效的把握整個框架,因為非凡的實現類一般不影響設計的整體。

例如,List接口定義了一個有序的元素集合。可用地實現包括ArrayList和LinkedList,它們都實現了List接口。當你的程序需要處理List時,不必考慮它是ArrayList還是LinkedList,只要知道所選用的類的屬性即可。這個屬性就是接口。

通過實現類的接口,并且在類設計時僅對外公布接口,你就有效的封裝了類的定義,這樣后臺實現的變動將對系統其它部分的影響最小。

以ArrayList和LinkedList為例。將ArrayList看作一個可增長的數組對象(指是存儲對象,而不是原始數據)。當類實現了List的全部接口時,它的特性在特定條件下是可以優化的。

例如,假如你的程序是要隊列表中的數據進行頻繁的隨機訪問,(例如,顯示第3,12,2,和25項數據)ArrayList類提供對列表中每一個數據快速查詢。快速查詢是以在列表中間添加和刪除數據的速度為代價的。假如后一種行為是你需要的,那么LinkedList類是一個好的選擇。它提供快速的順序訪問、添加和刪除,但是,代價是慢速隨機查詢。

在處理ArrayList和LinkedList時,有兩種方式創建對象:

List cityList = new ArrayList() ;

LinkedList peopleList = new LinkedList() ;

兩個代碼段都是正確的,但是這兩行代碼之間存在的顯著的差別。第一行表示我們要創建一個ArrayList,但是我們只需要把它作為一個List來訪問。第二行正好相反。是,LinkedList項目被創建了,ArrayList也一樣。但是,聲明部分說明它只能作為LinkedList來訪問,這就數它的最大區別。

理解接口真正變的重要是在這兩行代碼的用戶確定“查詢項目n”比在位置m處刪除(或添加)項目更為重要時。

PeopleList變量被聲明為LinkedList類型。這不是它本身的問題,因為你研究的更深層次的內容,你將發現peopleList在任何地方都被作為LinkedList對象處理。在你對peopleList使用LinkedList特有的方法的同時,假如你想把它作為ArrayList來處理,將會出現問題。

List peopleList = new ArrayList() ;

通過學習僅使用接口來處理任何對象,你將發現在設計完成之后修改實現,你需要修改的僅僅是聲明部分,除此之外,沒有任何代碼改動。這就是接口的絕妙之處。因為類的最初聲明是LinkedList,當類型變為List時意味著象addFirst或addLast這樣的方法是無效的,因為新的peopleList的類型是List,它沒有這些方法。

這種基于接口設計的代碼,就像Collection Framework所向大家承諾的那樣,任何人編寫的代碼是以循環構造方式進行的,而無需知道使用的是哪個Collection。創建的類是被限制為提供接口的完全實現。除此之外,新代碼將不能被編譯。

作為實例,下面的程序創建一組集合。每個集合提供一個系統定義的Iterator這樣集合的每個元素可以被訪問。這個iterator將被傳遞到幫助例程,在這里集合的獨立元素將被打印。

import java.util.*;
 
public class Interfaces {
 
   public static void main(String args[]) {
     Properties props = System.getProperties();
     Set keySet = props.keySet();
     dumpIterator(keySet.iterator());
 
     List list = Arrays.asList(args);
     dumpIterator(list.iterator());
   }
 
   private static void dumpIterator(Iterator itor) {
     // System.out.println(itor.getClass().getName());
     while (itor.hasNext()) {
       System.out.println(">> " + itor.next());
     }
     System.out.println("----");
   }
}



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新干县| 临沂市| 应用必备| 雷州市| 西峡县| 台前县| 龙泉市| 泰来县| 罗定市| 宣化县| 铜梁县| 博白县| 凌云县| 闽侯县| 永泰县| 昂仁县| 吉木萨尔县| 岚皋县| 长垣县| 锡林浩特市| 多伦县| 新田县| 涿州市| 桐庐县| 房山区| 晋中市| 沿河| 从化市| 拉萨市| 门源| 桦南县| 阳春市| 佳木斯市| 永平县| 洞口县| 东光县| 弥渡县| 娱乐| 通辽市| 蒙阴县| 惠安县|