• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            java中的接口和抽象類區別

                   首先,我們來看一下抽象類的概念,java編程思想中說萬物皆對象,我們知道所有的對象都是通過類來描繪的,但是反過來卻不是這樣。并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象類是表征我們對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。好比,我們都知道三角形是一個形狀,世界上有三角形這樣具體的東西,但是確沒有形狀這樣具體的東西,我們要描述這個形狀的概念就要用到抽象類。因此在java中抽象類是不允許被實例化的。
            在面向對象領域,抽象類主要用來進行類型隱藏。那什么是類型隱藏呢?我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。好比,動物是一個抽象類,人、猴子、老虎就是具體實現的派生類,我們就可以用動物類型來隱藏人、猴子和老虎的類型。
            再來看一下接口,接口是什么呢?Java中的接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。接口是一種特殊形式的抽象類。

            抽象類和接口有很大的區別,首先,抽象類在Java語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個接口。也許,這是Java語言的設計者在考慮Java對于多重繼承的支持方面的一種折中考慮吧。
            其次,在抽象類的定義中,我們可以賦予方法的默認行為。但是在接口的定義中,方法卻不能擁有默認行為,為了繞過這個限制,必須使用委托,但是這會 增加一些復雜性,有時會造成很大的麻煩。
            已經提到過,抽象類在Java語言中體現了一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在”is a”關系,即父類和派生類在概念本質上應該是相同的。對于接口來說則不然,并不要求接口的實現者和接口定義在概念本質上是一致的,僅僅是實現了接口定義的契約而已。接口表示的是”like a”關系。

            使用抽象類來定義允許多個實現的類型,比使用接口有一個明顯的優勢:抽象類的演化比接口的演化要容易的多。在后續的發行版中,如果希望在抽象類中增加一個方法,只增加一個默認的合理的實現即可,抽象類的所有實現都自動提供了這個新的方法。對于接口,這是行不通的。雖然可以在骨架實現類中增加一方法的實現來解決部分問題,但這不能解決不從骨架實現類繼承的接口實現的問題。由此,設計公有的接口要非常謹慎,一旦一個接口被公開且被廣泛實現,對它進行修改將是不可能的。

            所以,使用接口還是抽象類,取決于我們對問題的概念的本質理解和設計的意圖。

            //---------------------------------------------------------------------

                    類描述了一個實體,包括實體的狀態,也包括實體可能發出的動作。

              接口定義了一個實體可能發出的動作。但是只是定義了這些動作的原型,沒有實現,也沒有任何狀態信息。

              所以接口有點象一個規范、一個協議,是一個抽象的概念;而類則是實現了這個協議,滿足了這個規范的具體實體,是一個具體的概念。

              從程序角度,簡單理解,接口就是函數聲明,類就是函數實現。需要注意的是同一個聲明可能有很多種實現。 

              1、接口中定義類方法的原型,但是不能說是空方法,因為空方法的意思是有實現體,只不過實現體是空操作。實際上接口沒有定義任何實現體。具體的實現體都是在實現接口的類中,接口只是定義了這些方法的調用方式。

              你當然也可以不用接口,直接在類里面寫方法,但是如果你的一組方法需要在很多類里實現,那么把它們抽象出來,做成一個接口規范,不是更好么?

              2、一個類描述了一個實體,這個實體可能是一個復雜的對象,它的動作很多,如果把這些動作分類,用接口a定義其中的某一組動作,接口b定義其中的另外一組動作,這樣的結構,比較清楚。

              這種方式具備了多繼承的優點,避免了多繼承的缺陷。實際上在歷史上,接口在很大程度上,是為了解決多繼承帶來的種種問題而設計出來的。

              3、包中那些已定義的接口,怎么知道那里面定義了什么方法。

              接口里定義了方法的輸入輸出,這些都是協議,具體的實現都在每個類中。對于很多只需要抽象接口的地方,不需要知道具體的類是什么,只要這個類實現了這個接口就可以了。

             

            當然,以上只是對接口的初步認識,在對面向對象程序設計有更深入的認識以后,會發現接口有更廣泛的用途。

             

            另外,抽象類不能被實例化,也就是說,不能創建抽象類的任何對象。必須創建抽象類的子類,然后再創建子類的對象。一個接口可以繼承多個接口,一個類可以實現多個接口。

             

            posted on 2009-08-26 23:06 肥仔 閱讀(436) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            77777亚洲午夜久久多喷| 久久久黄色大片| 精品蜜臀久久久久99网站| 久久无码国产专区精品| 蜜桃麻豆WWW久久囤产精品| 一本大道久久东京热无码AV| 精品久久久久久国产91| 国产精品久久久久久影院| 国产成人久久AV免费| 久久精品国产影库免费看 | 久久亚洲国产午夜精品理论片| 国内精品久久人妻互换| 亚洲成色999久久网站| 久久久久久国产精品美女 | 韩国无遮挡三级久久| 久久综合欧美成人| 久久亚洲AV无码精品色午夜 | 久久久久久午夜成人影院| 日本精品久久久中文字幕| 人妻丰满?V无码久久不卡| 亚洲国产精品一区二区久久hs| 久久久久久a亚洲欧洲aⅴ | 亚洲伊人久久综合影院| 人妻无码久久一区二区三区免费 | 色青青草原桃花久久综合| 国产一区二区精品久久| 久久成人小视频| 久久夜色精品国产www| 久久久久久无码Av成人影院 | 区久久AAA片69亚洲| 香蕉久久夜色精品国产小说| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 亚洲国产精品成人AV无码久久综合影院| 91精品国产91久久久久福利| 9191精品国产免费久久| 五月丁香综合激情六月久久| 久久午夜电影网| 99久久er这里只有精品18| 久久久SS麻豆欧美国产日韩| 精品午夜久久福利大片| 亚洲国产精品无码久久98|