隨筆 - 3  文章 - 0  trackbacks - 0
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          搜索

          •  

          積分與排名

          • 積分 - 1572
          • 排名 - 4239

          最新評論

          閱讀排行榜

          評論排行榜

          聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。

                  接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

                 接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是可以繼承實體類,但前提是實體類必須有明確的構造函數。

                接口更關注“能實現什么功能”,而不管“怎么實現的”。

          相同及聯系
            A. 兩者都是抽象類,都不能實例化。
            B. interface實現類及abstrct class的子類都必須要實現已經聲明的抽象方法。

          2. 不同
            A. interface需要實現,要用implements,而abstract class需要繼承,要用extends。
            B. 一個類可以實現多個interface,但一個類只能繼承一個abstract class。
            C. interface強調特定功能的實現,而abstract class強調所屬關系。 
            D. 盡管interface實現類及abstrct class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是聲明的(declaration, 沒有方法體),實現類必須要實現。而abstract class的子類可以有選擇地實現。這個選擇有兩點含義:
              一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。
              二是abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以通過再次聲明其方法為抽象的方式,無需實現,留給其子類來實現,但此類必須也聲明為抽象類。既是抽象類,當然也不能實例化。
            E. abstract class是interface與Class的中介。
            interface是完全抽象的,只能聲明方法,而且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也不能聲明實例變量。然而,interface卻可以聲明常量變量,并且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其作為接口的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應的abstract class或Class中。
            abstract class在interface及Class中起到了承上啟下的作用。一方面,abstract class是抽象的,可以聲明抽象方法,以規范子類必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實例變量,以供子類通過繼承來使用。

          3. interface的應用場合
            A. 類與類之前需要特定的接口進行協調,而不在乎其如何實現。
            B. 作為能夠實現特定功能的標識存在,也可以是什么接口方法都沒有的純粹標識。
            C. 需要將一組類視為單一的類,而調用者只通過接口來與這組類發生聯系。
            D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯系。

          4. abstract class的應用場合
            一句話,在既需要統一的接口,又需要實例變量或缺省的方法的情況下,就可以使用它。最常見的有:
            A. 定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口。可以用abstract class定義一組方法體,甚至可以是空方法體,然后由子類選擇自己所感興趣的方法來覆蓋。
            B. 某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關系。abstract的中介作用可以很好地滿足這一點。
            C. 規范了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能。

          posted on 2007-07-06 15:53 y 閱讀(242) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 武冈市| 富源县| 得荣县| 广饶县| 房产| 福安市| 乐山市| 牙克石市| 芒康县| 深圳市| 浦城县| 洪洞县| 黔西县| 龙口市| 栾城县| 阜康市| 茌平县| 赞皇县| 丰城市| 开鲁县| 镇远县| 大同市| 禹州市| 宾川县| 宁晋县| 通榆县| 永州市| 永善县| 二连浩特市| 安国市| 丰城市| 台江县| 蒙自县| 平顶山市| 澄迈县| 当涂县| 山西省| 八宿县| 辰溪县| 凌源市| 昌吉市|