一、Java介面的基本內容
[1].Java程式設計語言中不支援多重繼承(即Java中一個類不能有多於一個的直接父類),但可以實現多個介面,這就間接地實現了多重繼承。
[2].介面(Interface)將產生一個完全抽象的類,它是用來建立類與類之間的協議的,其內部只提供調用方法的形式(建立者確定方法名、參數列表及傳回型別),而沒有提供任何具體的方法體。具體的實現方法(該介面中的所有方法)需要在遵循該特定介面的類中進行實現。建立介面需要使用關鍵字interface,而建立一個遵循某介面的類則需要使用關鍵字implements。
二、Java介面的基本特徵
[1].介面可以包含域,但是這些域不是介面的一部分,它們的值被儲存在該介面的靜態儲存區內;域隱式為public、static、final的(網域名稱通常大寫且單詞之間以底線串連),域不能是“空final”,在使用之前必須顯式地初始化,但可以被非常量運算式初始化。
[2].當實現一個介面時,介面中的方法必須是public的,通常隱式地為public及abstract的。
[3].介面必須通過類來實現它的抽象方法,且該類必須實現該介面中的所有方法,否則該類仍是一個抽象類別。
[4].介面因為沒有構造器而不能進行執行個體化,但運行定義介面類型的引用變數,該引用變數實現了該介面的類的執行個體。比如:
Interface Base{/*…*/}
Public class Derived implements Base{/*…*/}
//! Base b=new Base();error:介面不能進行執行個體化
Base b=new Derived();//引用變數b被定義為類型Base,引用了Derived執行個體
[5].一個類只能繼承一個父類,但可以實現多個介面,並可以向上轉型為每個介面(因為每個介面都是一個獨立的類型)。按照先類後介面(多個介面以逗號分開)的順序進行實現。例如:
Class BaseClass{}
Interface BaseIntfaceA{}
Interface BaseIntfaceB{}
Public class Derived extends BaseClass
implements BaseIntfaceA, BaseIntfaceB{}
[6].介面可以嵌套,嵌套在介面中的介面自動為public而不能修改為private。當實現某個介面時,不需要實現嵌套在其內部的任何介面。類中的private介面不能在定義它的類之外被實現。
[7].介面可以很好地應用於松耦合軟體系統構建之中。通過介面可以很方便地對已經存在的系統進行自下而上的抽象,對於任意的兩個類,只要他們存在有相同的功能,就能從中抽象出一個介面類型,而不用理會它們是否源自同一個父類。對於兩個系統,通過介面互動可以獲得比抽象類別互動更好的松耦合特性。
三、介面與抽象類別的異同點
[1].相同點:
<1>.二者都包含有描述系統能提供服務的抽象方法,都不提具體實現的方法體,都不能被執行個體化。
<2>.都位於繼承樹的上層,都代表系統的抽象層。當系統使用繼承樹上的類時,應盡量把引用變數聲明為繼承樹的上層抽象類別型,這樣可以提高兩個系統的松耦合程度。
[2].不同點:
<1>.抽象類別中可以定義調用方法的方法體以免在子類中的重複定義,對子類中修改方法體不會造成影響;對於介面,一旦介面公布就必須保持穩定,因為隨意向介面中添加方法會直接影響到子類的功能,此時子類要麼實現新增的方法,要麼就聲明為抽象類別,而聲明為抽象類別就意味著該類不能進行執行個體化,也就限制了該類的應用了。
<2>.一個類只能有一個直接父類(此父類可以是抽象類別),但它可以實現多個介面。當子類覆蓋父類的調用方法或隱藏父類的成員變數及靜態方法時,Java虛擬機器採用不同的綁定機制,為了簡化系統設計的複雜性和綁定機制,Java禁止多重繼承;對於介面,其內部只含有抽象方法而沒有執行個體變數及靜態方法,即便一個類實現多個介面也不會增加綁定機制的複雜性。
四、介面和抽象類別的使用原則
[1].使用介面作為系統與外界互動的視窗。
[2].介面必須保持穩定性。
[3].使用抽象類別來定製系統中擴充點。
Reference:
Bruce Eckel. <<Thinking in Java>>4-th
Edition
http://baidu/zhidao
HiЁnd. Java介面
張廣彬. Java課程設計案例精編.
清華大學出版社
一、Java介面的基本內容
[1].Java程式設計語言中不支援多重繼承(即Java中一個類不能有多於一個的直接父類),但可以實現多個介面,這就間接地實現了多重繼承。
[2].介面(Interface)將產生一個完全抽象的類,它是用來建立類與類之間的協議的,其內部只提供調用方法的形式(建立者確定方法名、參數列表及傳回型別),而沒有提供任何具體的方法體。具體的實現方法(該介面中的所有方法)需要在遵循該特定介面的類中進行實現。建立介面需要使用關鍵字interface,而建立一個遵循某介面的類則需要使用關鍵字implements。
二、Java介面的基本特徵
[1].介面可以包含域,但是這些域不是介面的一部分,它們的值被儲存在該介面的靜態儲存區內;域隱式為public、static、final的(網域名稱通常大寫且單詞之間以底線串連),域不能是“空final”,在使用之前必須顯式地初始化,但可以被非常量運算式初始化。
[2].當實現一個介面時,介面中的方法必須是public的,通常隱式地為public及abstract的。
[3].介面必須通過類來實現它的抽象方法,且該類必須實現該介面中的所有方法,否則該類仍是一個抽象類別。
[4].介面因為沒有構造器而不能進行執行個體化,但運行定義介面類型的引用變數,該引用變數實現了該介面的類的執行個體。比如:
Interface Base{/*…*/}
Public class Derived implements Base{/*…*/}
//! Base b=new Base();error:介面不能進行執行個體化
Base b=new Derived();//引用變數b被定義為類型Base,引用了Derived執行個體
[5].一個類只能繼承一個父類,但可以實現多個介面,並可以向上轉型為每個介面(因為每個介面都是一個獨立的類型)。按照先類後介面(多個介面以逗號分開)的順序進行實現。例如:
Class BaseClass{}
Interface BaseIntfaceA{}
Interface BaseIntfaceB{}
Public class Derived extends BaseClass
implements BaseIntfaceA, BaseIntfaceB{}
[6].介面可以嵌套,嵌套在介面中的介面自動為public而不能修改為private。當實現某個介面時,不需要實現嵌套在其內部的任何介面。類中的private介面不能在定義它的類之外被實現。
[7].介面可以很好地應用於松耦合軟體系統構建之中。通過介面可以很方便地對已經存在的系統進行自下而上的抽象,對於任意的兩個類,只要他們存在有相同的功能,就能從中抽象出一個介面類型,而不用理會它們是否源自同一個父類。對於兩個系統,通過介面互動可以獲得比抽象類別互動更好的松耦合特性。
三、介面與抽象類別的異同點
[1].相同點:
<1>.二者都包含有描述系統能提供服務的抽象方法,都不提具體實現的方法體,都不能被執行個體化。
<2>.都位於繼承樹的上層,都代表系統的抽象層。當系統使用繼承樹上的類時,應盡量把引用變數聲明為繼承樹的上層抽象類別型,這樣可以提高兩個系統的松耦合程度。
[2].不同點:
<1>.抽象類別中可以定義調用方法的方法體以免在子類中的重複定義,對子類中修改方法體不會造成影響;對於介面,一旦介面公布就必須保持穩定,因為隨意向介面中添加方法會直接影響到子類的功能,此時子類要麼實現新增的方法,要麼就聲明為抽象類別,而聲明為抽象類別就意味著該類不能進行執行個體化,也就限制了該類的應用了。
<2>.一個類只能有一個直接父類(此父類可以是抽象類別),但它可以實現多個介面。當子類覆蓋父類的調用方法或隱藏父類的成員變數及靜態方法時,Java虛擬機器採用不同的綁定機制,為了簡化系統設計的複雜性和綁定機制,Java禁止多重繼承;對於介面,其內部只含有抽象方法而沒有執行個體變數及靜態方法,即便一個類實現多個介面也不會增加綁定機制的複雜性。
四、介面和抽象類別的使用原則
[1].使用介面作為系統與外界互動的視窗。
[2].介面必須保持穩定性。
[3].使用抽象類別來定製系統中擴充點。
Reference:
Bruce Eckel. <<Thinking in Java>>4-th
Edition
http://baidu/zhidao
HiЁnd. Java介面
張廣彬. Java課程設計案例精編.
清華大學出版社