<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sung in Blog

               一些技術文章 & 一些生活雜碎

    好的面向對象編程要求類設計人員隱藏那些不需要類的使用人員了解的信息。對于 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("----");
    }
    ? }

    ??? 類Iterator的類型是unknown,這正是接口的絕妙之處,而不是問題。真正的事實是iterator方法返回的是一個真實的Iterator對象。然而,dumpIterator通常提供接口的完全實現。

    ??? 如果你去掉dumpIterator中的println行的注釋,你將發現真實的iterator類名,對Properties是Hashtable.Enumerator而List是AbstractList.Itr。這個事實不必知道,也不會對你的程序有任何幫助。真正重要的是List和Properties的iterator方法所返回的任何對象,必須實現java.util.Iterator:hasNext, next和remove方法。沒有這三種方法中任何兩種,dumpIterator方法將永遠不能工作。

    posted on 2005-09-19 22:14 Sung 閱讀(127) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 国产亚洲精品国看不卡| 亚洲AV中文无码乱人伦| 亚洲另类激情综合偷自拍| 大地资源中文在线观看免费版| 国产成人亚洲综合在线| 日本不卡高清中文字幕免费| 亚洲精品乱码久久久久久久久久久久| 人体大胆做受免费视频| 免费阿v网站在线观看g| 亚洲中文字幕无码爆乳av中文| 日韩a毛片免费观看| 亚洲精品国精品久久99热一| 免费在线看黄网站| 亚洲成a人片7777| 免费高清在线影片一区| 亚洲男女一区二区三区| 黄色片在线免费观看| 亚洲精品一卡2卡3卡四卡乱码| 亚洲网站在线免费观看| 久久亚洲精品国产亚洲老地址| 日本免费网站在线观看| 一区二区三区免费电影| 亚洲成年人啊啊aa在线观看| 国产人成网在线播放VA免费| 亚洲国产成人综合精品| 亚洲av成人一区二区三区在线观看 | 大陆一级毛片免费视频观看| 亚洲精品永久在线观看| 久久亚洲国产精品123区| 亚洲一区二区免费视频| 亚洲VA中文字幕无码一二三区| 国产偷国产偷亚洲高清人| 亚洲精品午夜无码电影网| 最近中文字幕大全免费视频 | 美女露隐私全部免费直播| 免费看韩国黄a片在线观看| 噜噜噜亚洲色成人网站| 久久亚洲国产视频| 久久国产色AV免费看| 亚洲av乱码一区二区三区按摩 | 亚洲老熟女@TubeumTV|