亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

抽象類與接口

2019-11-11 01:30:48
字體:
來源:轉載
供稿:網友

接口和內部類為我們提供了一種將接口與實現分離的更加結構化的方法。

       抽象類與接口是java語言中對抽象概念進行定義的兩種機制,正是由于他們的存在才賦予java強大的面向對象的能力。他們兩者之間對抽象概念的支持有很大的相似,甚至可以互換,但是也有區別。

      一、抽象類

       我們都知道在面向對象的領域一切都是對象,同時所有的對象都是通過類來描述的,但是并不是所有的類都是來描述對象的。如果一個類沒有足夠的信息來描述一個具體的對象,而需要其他具體的類來支撐它,那么這樣的類我們稱它為抽象類。比如new Animal(),我們都知道這個是產生一個動物Animal對象,但是這個Animal具體長成什么樣子我們并不知道,它沒有一個具體動物的概念,所以他就是一個抽象類,需要一個具體的動物,如狗、貓來對它進行特定的描述,我們才知道它長成啥樣。

      在面向對象領域由于抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能實例化的。

      同時,抽象類體現了數據抽象的思想,是實現多態的一種機制。它定義了一組抽象的方法,至于這組抽象方法的具體表現形式有派生類來實現。同時抽象類提供了繼承的概念,它的出發點就是為了繼承,否則它沒有存在的任何意義。所以說定義的抽象類一定是用來繼承的,同時在一個以抽象類為節點的繼承關系等級鏈中,葉子節點一定是具體的實現類。(不知這樣理解是否有錯!!!高手指點….)

      在使用抽象類時需要注意幾點:

         1、抽象類不能被實例化,實例化的工作應該交由它的子類來完成,它只需要有一個引用即可。

         2、抽象方法必須由子類來進行重寫。

         3、只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。

         4、抽象類中可以包含具體的方法,當然也可以不包含抽象方法。

         5、子類中的抽象方法不能與父類的抽象方法同名。

         6、abstract不能與final并列修飾同一個類。

         7、abstract 不能與PRivate、static、final或native并列修飾同一個方法。、

      實例:

      定義一個抽象動物類Animal,提供抽象方法叫cry(),貓、狗都是動物類的子類,由于cry()為抽象方法,所以Cat、Dog必須要實現cry()方法。如下:

[java] view plain copy 在CODE上查看代碼片public abstract class Animal {      public abstract void cry();  }    public class Cat extends Animal{        @Override      public void cry() {          System.out.println("貓叫:喵喵...");      }  }    public class Dog extends Animal{        @Override      public void cry() {          System.out.println("狗叫:汪汪...");      }    }    public class Test {        public static void main(String[] args) {          Animal a1 = new Cat();          Animal a2 = new Dog();                    a1.cry();          a2.cry();      }  }    --------------------------------------------------------------------  Output:  貓叫:喵喵...  狗叫:汪汪...  

      創建抽象類和抽象方法非常有用,因為他們可以使類的抽象性明確起來,并告訴用戶和編譯器打算怎樣使用他們.抽象類還是有用的重構器,因為它們使我們可以很容易地將公共方法沿著繼承層次結構向上移動。(From:Think%20in%20java%20)

      二、接口      接口是一種比抽象類更加抽象的“類”。這里給“類”加引號是我找不到更好的詞來表示,但是我們要明確一點就是,接口本身就不是類,從我們不能實例化一個接口就可以看出。如new%20Runnable();肯定是錯誤的,我們只能new它的實現類。

      接口是用來建立類與類之間的協議,它所提供的只是一種形式,而沒有具體的實現。同時實現該接口的實現類必須要實現該接口的所有方法,通過使用implements關鍵字,他表示該類在遵循某個或某組特定的接口,同時也表示著“interface只是它的外貌,但是現在需要聲明它是如何工作的”。

      接口是抽象類的延伸,java了保證數據安全是不能多重繼承的,也就是說繼承只能存在一個父類,但是接口不同,一個類可以同時實現多個接口,不管這些接口之間有沒有關系,所以接口彌補了抽象類不能多重繼承的缺陷,但是推薦繼承和接口共同使用,因為這樣既可以保證數據安全性又可以實現多重繼承。

      在使用接口過程中需要注意如下幾個問題:

         1、個Interface的方所有法訪問權限自動被聲明為public。確切的說只能為public,當然你可以顯示的聲明為protected、private,但是編譯會出錯!

         2、接口中可以定義“成員變量”,或者說是不可變的常量,因為接口中的“成員變量”會自動變為為public%20static%20final。可以通過類命名直接訪問:ImplementClass.name。

         3、接口中不存在實現的方法。

    %20    4、實現接口的非抽象類必須要實現該接口的所有方法。抽象類可以不用實現。

     %20 %20 5、不能使用new操作符實例化一個接口,但可以聲明一個接口變量,該變量必須引用(refer%20to)一個實現該接口的類的對象??梢允褂?20instanceof%20檢查一個對象是否實現了某個特定的接口。例如:if(anObject%20instanceof%20Comparable){}。

     %20 %20 6、在實現多接口的時候一定要避免方法名的重復。

      三、抽象類與接口的區別      盡管抽象類和接口之間存在較大的相同點,甚至有時候還可以互換,但這樣并不能彌補他們之間的差異之處。下面將從語法層次和設計層次兩個方面對抽象類和接口進行闡述。

      3.1語法層次      在語法層次,java語言對于抽象類和接口分別給出了不同的定義。下面已Demo類來說明他們之間的不同之處。

      使用抽象類來實現:

[java] view%20plain copy public abstract class Demo {      abstract void method1();                  void method2(){          //實現      }  }         使用接口來實現

[java] view%20plain copy interface Demo {      void method1();      void method2();  }         抽象類方式中,抽象類可以擁有任意范圍的成員數據,同時也可以擁有自己的非抽象方法,但是接口方式中,它僅能夠有靜態、不能修改的成員數據(但是我們一般是不會在接口中使用成員數據),同時它所有的方法都必須是抽象的。在某種程度上來說,接口是抽象類的特殊化。

      對子類而言,它只能繼承一個抽象類(這是java為了數據安全而考慮的),但是卻可以實現多個接口。

      3.2設計層次      上面只是從語法層次和編程角度來區分它們之間的關系,這些都是低層次的,要真正使用好抽象類和接口,我們就必須要從較高層次來區分了。只有從設計理念的角度才能看出它們的本質所在。一般來說他們存在如下三個不同點:

      1、%20抽象層次不同。抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。

      2、%20跨域不同。抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然后泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關系,共同之處。例如貓、狗可以抽象成一個動物類抽象類,具備叫的方法。鳥、飛機可以實現飛Fly接口,具備飛的行為,這里我們總不能將鳥、飛機共用一個父類吧!所以說抽象類所體現的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a"%20關系,即父類和派生類在概念本質上應該是相同的。對于接口則不然,并不要求接口的實現者和接口定義在概念本質上是一致的,%20僅僅是實現了接口定義的契約而已。

      3、%20設計層次不同。對于抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至于什么子類、什么時候怎么實現它一概不知。比如我們只有一個貓類在這里,如果你這是就抽象成一個動物類,是不是設計有點兒過度?我們起碼要有兩個動物類,貓、狗在這里,我們在抽象他們的共同點形成動物抽象類吧!所以說抽象類往往都是通過重構而來的!但是接口就不同,比如說飛,我們根本就不知道會有什么東西來實現這個飛接口,怎么實現也不得而知,我們要做的就是事前定義好飛的行為接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。

      (上面純屬個人見解,如有出入、錯誤之處,望各位指點?。。。。?/strong>

      為了更好的闡述他們之間的區別,下面將使用一個例子來說明。該例子引自:http://blog.csdn.net/ttgjz/article/details/2960451

      我們有一個Door的抽象概念,它具備兩個行為open()和close(),此時我們可以定義通過抽象類和接口來定義這個抽象概念:

      抽象類:

[java] view%20plain copy abstract class Door{      abstract void open();      abstract void close();  }        接口

[java] view%20plain copy interface Door{      void open();      void close();  }         至于其他的具體類可以通過使用extends使用抽象類方式定義Door或者Implements使用接口方式定義Door,這里發現兩者并沒有什么很大的差異。

      但是現在如果我們需要門具有報警的功能,那么該如何實現呢?

      解決方案一:給Door增加一個報警方法:clarm();

[java] view%20plain copy abstract class Door{      abstract void open();      abstract void close();      abstract void alarm();  }         或者

[java] view%20plain copy interface Door{      void open();      void close();      void alarm();  }         這種方法違反了面向對象設計中的一個核心原則%20ISP%20(Interface%20Segregation%20Princ派生到我的代碼片abstract class Door{      abstract void open();      abstract void close();  }    interface Alarm{      void alarm();  }    class AlarmDoor extends Door implements Alarm{      void open(){}      void close(){}      void alarm(){}  }         這種實現方式基本上能夠明確的反映出我們對于問題領域的理解,正確的揭示我們的設計意圖。其實抽象類表示的是"is-a"關系,接口表示的是"like-a"關系,大家在選擇時可以作為一個依據,當然這是建立在對問題領域的理解上的,比如:如果我們認為AlarmDoor在概念本質上是報警器,同時又具有Door的功能,那么上述的定義方式就要反過來了。

      批注:

   ISP(Interface Segregation Principle):面向對象的一個核心原則。它表明使用多個專門的接口比使用單一的總接口要好。

   一個類對另外一個類的依賴性應當是建立在最小的接口上的。

   一個接口代表一個角色,不應當將不同的角色都交給一個接口。沒有關系的接口合并在一起,形成一個臃腫的大接口,這是對角色和接口的污染。

      

      四、總結

      1、 抽象類在java語言中所表示的是一種繼承關系,一個子類只能存在一個父類,但是可以存在多個接口。

      2、 在抽象類中可以擁有自己的成員變量和非抽象類方法,但是接口中只能存在靜態的不可變的成員數據(不過一般都不在接口中定義成員數據),而且它的所有方法都是抽象的。

      3、抽象類和接口所反映的設計理念是不同的,抽象類所代表的是“is-a”的關系,而接口所代表的是“like-a”的關系。

      抽象類和接口是java語言中兩種不同的抽象概念,他們的存在對多態提供了非常好的支持,雖然他們之間存在很大的相似性。但是對于他們的選擇往往反應了您對問題域的理解。只有對問題域的本質有良好的理解,才能做出正確、合理的設計。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久噜噜噜久久| 91久久精品在线| 欧美日韩精品在线播放| 精品国产老师黑色丝袜高跟鞋| 91成人精品网站| 亚洲女人天堂成人av在线| 亚洲欧美另类国产| 成人亚洲激情网| 国产亚洲精品成人av久久ww| 久久久人成影片一区二区三区| 超碰97人人做人人爱少妇| 国产亚洲欧洲黄色| 亚洲美女福利视频网站| 国产噜噜噜噜久久久久久久久| 91在线观看免费高清完整版在线观看| 97视频在线免费观看| 狠狠色狠色综合曰曰| 亚洲国产精品资源| 亚洲人成电影网站色www| 亚洲美腿欧美激情另类| 91精品啪aⅴ在线观看国产| 日韩免费在线播放| 一区二区三区亚洲| 国产福利精品av综合导导航| 色偷偷88888欧美精品久久久| 中日韩午夜理伦电影免费| 国产精品人成电影| 久久天堂电影网| 欧美国产精品日韩| 69久久夜色精品国产69乱青草| 精品一区二区三区四区在线| 日韩av手机在线观看| 国产视频精品自拍| 国产午夜精品全部视频在线播放| 日韩毛片中文字幕| 91精品国产高清久久久久久久久| 国产精品99一区| 国产精品美女主播在线观看纯欲| 国产精品久久久久77777| 国产精品成人v| 久久久久久久久久久网站| 欧美大片大片在线播放| 欧美日韩国产成人高清视频| 亚洲午夜性刺激影院| www.日韩av.com| 久久免费少妇高潮久久精品99| 国产精品jizz在线观看麻豆| 国产欧美一区二区白浆黑人| 久久久999国产| 亚洲男人的天堂在线播放| 夜夜嗨av一区二区三区免费区| 国产成人涩涩涩视频在线观看| 欧美一级片久久久久久久| 精品动漫一区二区| 亚洲国产精品va在线看黑人动漫| 92裸体在线视频网站| 国产精品99免视看9| 亚洲图片制服诱惑| 91精品久久久久久综合乱菊| 国产精品香蕉av| 成人精品一区二区三区电影黑人| 中文字幕国产精品久久| 亚洲精品福利免费在线观看| 欧美激情区在线播放| 国产精品久久一区| 欧美日韩国产91| 欧美理论电影在线观看| 日韩成人中文字幕| 亚洲国产欧美一区二区三区久久| 国产精品久久久久999| 日韩最新中文字幕电影免费看| 最新日韩中文字幕| 亚洲国产成人精品久久| 欧美老妇交乱视频| 日韩成人在线视频观看| 亚洲一区二区三区久久| 成人激情视频在线观看| 国产精品久久久久久久久男| 久青草国产97香蕉在线视频| 国产精品一区电影| 国产精品免费一区豆花| 成人在线视频网站| 亚洲欧美日韩爽爽影院| 亚洲韩国欧洲国产日产av| 91久热免费在线视频| 久久人人爽人人| 日韩中文字幕国产| 青青久久aⅴ北条麻妃| 尤物yw午夜国产精品视频明星| 中文字幕日韩精品在线观看| 久久久精品视频在线观看| 国产一级揄自揄精品视频| 亚洲自拍中文字幕| 久久综合网hezyo| 久久久久久午夜| 成年无码av片在线| 欧美床上激情在线观看| 日韩av手机在线观看| 亚洲欧美在线x视频| 久久人人爽人人爽人人片亚洲| 国产免费一区视频观看免费| 精品一区二区亚洲| 国产一区二区视频在线观看| 日韩美女在线播放| 91精品视频免费观看| 亚洲欧美日本伦理| 另类色图亚洲色图| 亚洲自拍偷拍在线| 欧美性在线观看| 在线视频精品一| 国产精品久久av| 亚洲欧美一区二区三区在线| 青青草99啪国产免费| 久久久av一区| 国产成人精品亚洲精品| 亚洲综合最新在线| 久久人人爽人人爽人人片av高清| 欧美日本高清视频| 成人免费看黄网站| 丰满岳妇乱一区二区三区| 久久久免费高清电视剧观看| 国产有码在线一区二区视频| 久久综合久久88| 久久久久中文字幕2018| 亚洲国产欧美一区二区三区同亚洲| 欧美中文字幕视频在线观看| 成人久久久久久久| 久99久在线视频| 国产精品劲爆视频| 日韩成人小视频| 欧美激情手机在线视频| 久久精品福利视频| 亚洲自拍小视频免费观看| 亚洲成人激情在线| 欧美日韩免费一区| 欧美激情国产高清| 欧美国产亚洲视频| 亚洲无av在线中文字幕| 中文字幕国内精品| 九九热精品在线| 亚洲一区二区三区在线视频| 欧美第一黄网免费网站| 欧美精品制服第一页| 日韩av在线播放资源| 国产精品无码专区在线观看| 成人免费网视频| 精品福利在线观看| 亚洲美女在线看| 日韩电影在线观看永久视频免费网站| 欧美激情2020午夜免费观看| 成人欧美一区二区三区黑人孕妇| 亚洲国产一区二区三区四区| 日韩电影免费观看中文字幕| 国模视频一区二区三区| 91中文字幕在线观看| 成人国产在线视频| 68精品国产免费久久久久久婷婷| 亚洲电影免费观看高清完整版在线| 色综合色综合久久综合频道88| 欧美放荡办公室videos4k| 国产精品久久久久久超碰| 久久久91精品国产| 九九热这里只有在线精品视| 97超碰蝌蚪网人人做人人爽|