程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 具體解析Java中籠統類和接口的差別

具體解析Java中籠統類和接口的差別

編輯:關於JAVA

具體解析Java中籠統類和接口的差別。本站提示廣大學習愛好者:(具體解析Java中籠統類和接口的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是具體解析Java中籠統類和接口的差別正文


在Java說話中, abstract class 和interface 是支撐籠統類界說的兩種機制。恰是因為這兩種機制的存在,才付與了Java壯大的 面向對象才能。abstract class和interface之間在關於籠統類界說的支撐方面具有很年夜的類似性,乃至可以互相調換,是以許多開辟者在進 行籠統類界說時關於abstract class和interface的選擇顯得比擬隨便。其實,二者之間照樣有很年夜的差別的,關於它們的選擇乃至反應出對 於成績范疇實質的懂得、關於設計意圖的懂得能否准確、公道。本文將對它們之間的差別停止一番分析,試圖給開辟者供給一個在兩者之間停止選擇的根據。

  懂得籠統類

  abstract class和interface在Java說話中都是用來停止籠統類(本文 中的籠統類並不是從abstract class翻譯而來,它表現的是一個籠統體,而abstract class為Java說話頂用於界說籠統類的一種辦法, 請讀者留意辨別)界說的,那末甚麼是籠統類,應用籠統類能為我們帶來甚麼利益呢?

  在 面向對象的概念中,我們曉得一切的對象都是經由過程類來描寫的,然則反過去卻不是如許。其實不是 一切的類都是用來描寫對象的,假如一個類中沒有包括足夠的信息來描寫一個詳細的對象,如許的類就是籠統類。籠統類常常用來表征我們在對成績范疇停止剖析、 設計中得出的籠統概念,是對一系列看上去分歧,然則實質上雷同的詳細概念的籠統。好比:假如我們停止一個圖形編纂軟件的開辟,就會發明成績范疇存在著圓、 三角形如許一些詳細概念,它們是分歧的,然則它們又都屬於外形如許一個概念,外形這個概念在成績范疇是不存在的,它就是一個籠統概念。恰是由於籠統的概念 在成績范疇沒有對應的詳細概念,所以用以表征籠統概念的籠統類是不克不及夠實例化的。

  在面向對象范疇,籠統類重要用來停止類型隱蔽。 我們可以結構出一個固定的一組行動的籠統描 述,然則這組行動卻可以或許有隨意率性個能夠的詳細完成方法。這個籠統描寫就是籠統類,而這一組隨意率性個能夠的詳細完成則表示為一切能夠的派生類。模塊可以操作一個 籠統體。因為模塊依附於一個固定的籠統體,是以它可所以不許可修正的;同時,經由過程從這個籠統體派生,也可擴大此模塊的行動功效。熟習OCP的讀者必定知 道,為了可以或許完成面向對象設計的一個最焦點的准繩OCP(Open-Closed Principle),籠統類是個中的症結地點。

  從語法界說層面看abstract class 和 interface

  在語法層面,Java說話關於abstract class和interface給出了分歧的界說方法,上面以界說一個名為Demo的籠統類為例來講明這類分歧。

  應用abstract class的方法界說Demo籠統類的方法以下:


abstract class Demo{
abstract void method1();
abstract void method2();


  應用interface的方法界說Demo籠統類的方法以下:


interface Demo{
void method1();
void method2();

}

  在abstract class方法中,Demo可以有本身的數據成員,也能夠有非 abstract的成員辦法,而在interface方法的完成中,Demo只可以或許有靜態的不克不及被修正的數據成員(也就是必需是static final 的,不外在interface中普通不界說數據成員),一切的成員辦法都是abstract的。從某種意義上說,interface是一種特別情勢的 abstract class。

  從編程的角度來看,abstract class和interface都可以用來完成 "design by contract" 的思惟。然則在詳細的應用下面照樣有一些差別的。

  起首,abstract class 在 Java 說話中表現的是一種繼續關系,一個類只能應用一次繼續關系(由於Java不支撐多繼續 -- 轉注)。然則,一個類卻可以完成多個interface。或許,這是Java說話的設計者在斟酌Java關於多重繼續的支撐方面的一種折衷斟酌吧。

  其次,在abstract class的界說中,我們可以付與辦法的默許行動。然則在interface的界說中,辦法卻不克不及具有默許行動,為了繞過這個限制,必需應用拜托,然則這會增長一些龐雜性,有時會形成很年夜的費事。

  在 籠統類中不克不及界說默許行動還存在另外一個比擬嚴重的成績,那就是能夠會形成保護上的費事。因 為假如後來想修正類的界面(普通經由過程 abstract class 或許interface來表現)以順應新的情形(好比,添加新的辦法或許給已用的辦法中添 加新的參數)時,就會異常的費事,能夠要消費許多的時光(關於派生類許多的情形,尤其如斯)。然則假如界面是經由過程abstract class來完成的,那 麼能夠就只須要修正界說在abstract class中的默許行動便可以了。

  異樣,假如不克不及在籠統類中界說默許行動,就會招致異樣的辦法完成湧現在該籠統類的每個派生類中,違背了 "one rule,one place" 准繩,形成代碼反復,異樣晦氣於今後的保護。是以,在abstract class和interface間停止選擇時要異常的當心。

  從設計理念層面看 abstract class 和 interface

  下面重要從語法界說和編程的角度闡述了abstract class和interface的區 別,這些層面的差別是比擬低條理的、非實質的。本末節將從另外一個層面:abstract class和interface所反應出的設計理念,來剖析一下兩者的差別。作者以為,從這個層面停止剖析能力懂得兩者概念的實質地點。

  後面曾經提到過,abstract class在Java說話中表現了一種繼續關系,要想使得 繼續關系公道,父類和派生類之間必需存在"is-a"關系,即父類和派生類在概念實質上應當是雷同的。關於interface來講則否則,其實不請求interface的完成者和interface界說在概念實質上是分歧的, 僅僅是完成了interface界說的契約罷了。為了使闡述便於懂得,上面將經由過程一個簡略的實例停止解釋。

  斟酌如許一個例子,假定在我們的成績范疇中有一個關於Door的籠統概念,該Door具有履行兩個舉措open和close,此時我們可以經由過程abstract class或許interface來界說一個表現該籠統概念的類型,界說方法分離以下所示:

  應用abstract class方法界說Door:


abstract class Door{
abstract void open();
abstract void close();
}

  應用interface方法界說Door:


interface Door{
void open();
void close();
}

  其他詳細的Door類型可以extends應用abstract class方法界說的Door或許implements應用interface方法界說的Door。看起來似乎應用abstract class和interface沒有年夜的差別。

  假如如今請求Door還要具有報警的功效。我們該若何設計針對該例子的類構造呢(在本例中, 重要是為了展現 abstract class 和interface 反應在設計理念上的差別,其他方面有關的成績都做了簡化或許疏忽)?上面將枚舉出能夠的解 決計劃,並從設計理念層面臨這些分歧的計劃停止剖析。

  處理計劃一:

  簡略的在Door的界說中增長一個alarm辦法,以下:


abstract class Door{
abstract void open();
abstract void close();
abstract void alarm();
}

  或許


interface Door{
void open();
void close();
void alarm();
}

  那末具有報警功效的AlarmDoor的界說方法以下:


class AlarmDoor extends Door{
void open(){…}
void close(){…}
void alarm(){…}
}

  或許


class AlarmDoor implements Door{
void open(){…}
void close(){…}
void alarm(){…}

  這類辦法違背了面向對象設計中的一個焦點准繩 ISP (Interface Segregation Principle),在Door的界說中把Door概念自己固有的行動辦法和別的一個概念"報警器"的行動方 法混在了一路。如許惹起的一個成績是那些僅僅依附於Door這個概念的模塊會由於"報警器"這個概念的轉變(好比:修正alarm辦法的參數)而轉變,反 之仍然。

  處理計劃二:

  既然open、close和alarm屬於兩個分歧的概念,依據ISP准繩應當把它們分離定 義在代表這兩個概念的籠統類中。界說方法有:這兩個概念都應用 abstract class 方法界說;兩個概念都應用interface方法界說;一個概念 應用 abstract class 方法界說,另外一個概念應用interface方法界說。

  明顯,因為Java說話不支撐多重繼續,所以兩個概念都應用abstract class方法界說是弗成行的。前面兩種方法都是可行的,然則關於它們的選擇卻反應出關於成績范疇中的概念實質的懂得、關於設計意圖的反應能否准確、公道。我們逐個來剖析、解釋。

  假如兩個概念都應用interface方法來界說,那末就反應出兩個成績:1、我們能夠沒有 懂得清晰成績范疇,AlarmDoor在概念實質上究竟是Door照樣報警器?2、假如我們關於成績范疇的懂得沒有成績,好比:我們經由過程關於成績范疇的分 析發明AlarmDoor在概念實質上和Door是分歧的,那末我們在完成時就沒有可以或許准確的提醒我們的設計意圖,由於在這兩個概念的界說上(均應用 interface方法界說)反應不出上述寄義。

  假如我們關於成績范疇的懂得是:AlarmDoor在概念實質上是Door,同時它有具有報 警的功效。我們該若何來設計、完成來明白的反應出我們的意思呢?後面曾經說過,abstract class在Java說話中表現一種繼續關系,而繼續關系 在實質上是"is-a"關系。所以關於Door這個概念,我們應當應用abstarct class方法來界說。別的,AlarmDoor又具有報警功效,說 明它又可以或許完成報警概念中界說的行動,所以報警概念可以經由過程interface方法界說。以下所示:


abstract class Door{
abstract void open();
abstract void close();
}
interface Alarm{
void alarm();
}
class Alarm Door extends Door implements Alarm{
void open(){…}
void close(){…}
void alarm(){…}
}

  這類完成方法根本上可以或許明白的反應出我們關於成績范疇的懂得,准確的提醒我們的設計意圖。其 實abstract class表現的是"is-a"關系,interface表現的是"like-a"關系,年夜家在選擇時可以作為一個根據,固然這是樹立在對成績范疇的懂得上的,好比:假如我們以為AlarmDoor在概念實質上是報警器,同時又具有Door的功效,那末上述的界說方法就要反過去了。

  小結

  1.abstract class 在 Java 說話中表現的是一種繼續關系,一個類只能應用一次繼續關系。然則,一個類卻可以完成多個interface。

  2.在abstract class 中可以有本身的數據成員,也能夠有非abstarct的成員辦法,而在interface中,只可以或許有靜態的不克不及被修正的數據成員(也就是必需是static final的,不外在 interface中普通不界說數據成員),一切的成員辦法都是abstract的。

  3.abstract class和interface所反應出的設計理念分歧。其實abstract class表現的是"is-a"關系,interface表現的是"like-a"關系。

  4.完成籠統類和接口的類必需完成個中的一切辦法。籠統類中可以有非籠統辦法。接口中則不克不及有完成辦法。

  5.接口中界說的變量默許是public static final 型,且必需給其初值,所以完成類中不克不及從新界說,也不克不及轉變其值。

  6.籠統類中的變量默許是 friendly 型,其值可以在子類中從新界說,也能夠從新賦值。

  7.接口中的辦法默許都是 public,abstract 類型的。

  結論

  abstract class 和 interface 是 Java說話中的兩種界說籠統類的方法,它們之間有很年夜的類似性。然則關於它們的選擇卻又常常反應出關於成績范疇中的概 念實質的懂得、關於設計意圖的反應能否准確、公道,由於它們表示了概念間的分歧的關系(固然都可以或許完成需求的功效)。這其實也是說話的一種的習用法,願望讀者同伙可以或許細細領會。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved