1. 在java中,類與類之間只能是單繼承,而不是多繼承。多繼承缺點:(1)如果在一個子類繼承的多個父類中擁有相同名稱的變數,子類在引用該變數時將產生歧義,無法判斷應該使用哪個父類的變數;(2)繼承的擁有多個相同的方法,子類中又沒有覆蓋該方法,那麼調用該方法時就會產生歧義。Java提供了介面,通過介面的功能實現多繼承的優點而摒棄其缺點。
讓規範和實現分離正是介面的好處,讓軟體系統的各組件之間面向介面耦合,是一種耦合(聯絡)設計。
軟體系統各模組之間也應該採用這種面向介面的耦合,從而盡量減少各模組之間的耦合度,為系統提供更好的可擴充性和可維護性。
2.和類的定義不同,定義介面時不再使用class,而是使用interface,從某個角度看,介面可被看成一個特殊的類,因此一個java源檔案裡最多隻能有一個public介面,如果定義了一個public介面,則該源檔案的主檔案名就必須與該介面名相同。
基本文法格式:
[public] interface 介面名 [extends 父介面1,父介面2,…]{ //介面支援多繼承,多個父介面之間用逗號分隔
[public][static][final] 資料類型 屬性名稱=常量值;
[public abstract] 傳回值類型 方法名([形參表]);
1). 介面的屬性必須用public static final修飾,是系統預設的,可部分省略或全部省略,但一般都寫出final。
int MAX_SIZE = 50; 等價於
public static final int MAX_SIZE = 50;
2). 介面的方法預設為publicabstract,一般不寫修飾符,可省略--介面中的方法都是抽象方法。
3).介面中的成員變數都是共有的、靜態、最終的常量。介面中的方法都是公用的、抽象的、僅有方法簽名、沒有方法體。
3. 介面是另一種定義資料類型的方式。它和類非常相似的。
ü 相同之處:都有成員變數和成員方法
也可以形成繼承關係
ü 不同之處:介面中的屬性都是常量(final)
介面中的方法是抽象方法(沒有方法體)
引入介面的原因:Java只支援單重繼承,每個類只能有一個超類。但實際應用中有時候需要多重繼承--使用介面,一個類可以實現多個介面。
4. 介面定義後不能直接建立對象,必須由類實現介面後建立類的對象。每個類只能繼承一個基類,但可以實現多個介面。介面不能顯示繼承任何類,但所有介面類型的引用變數都可以直接賦給Object類型的引用變數。編譯器知道任何java對象都比必須是Object或其子類的執行個體。類定義形式如下:
[public] class 類名 extends 基類 implements 介面1,…{ //類體 }
注意:類實現介面,就繼承了介面中的所有成員變數和成員方法。由於介面中的方法都是抽象的,因此實現介面的類必須重寫這些方法。
5. 注意:
ü 實現介面中的抽象方法時,除去掉關鍵字abstract外,方法頭必須和介面定義中的方法頭完全相同,並且public修飾符不能省略。
ü 如果類實現了多個介面,必須重寫這些介面中的所有方法。
ü 介面不是類,不能使用new執行個體化介面,但可以聲明介面變數。介面變數可以指向一個實現了該介面的類的對象,例如,
Shape s=new Shape(); //錯
Shape s=new Circle(); //對
ü 可以使用instanceof來判斷對象是否實現了某個介面。
ü 雖然可以使用介面變數來引用實現介面類的對象,但這種引用只能引用介面的成員,否則會發生編譯錯誤。
強調:一個介面定義一個協定,實現介面的類必須遵守其協定。介面最適合為不相關的類提供通用功能,利用介面提供的方法,程式可以多態地處理這些完全不同的類的對象。
6. 介面和抽象類別
µ 介面和抽象類別很像,它們都具有如下特徵:
ü 介面和抽象類別都不能被執行個體化,它們都位於繼承樹的頂端,用於被其他類實現和繼承。
ü 介面和抽象類別都可以包含抽象方法,實現介面或繼承抽象類別的普通子類都必須實現這些抽象方法。
µ 區別
ü 設計目的不同
介面體現的是一種規範,類似於整個系統的“總綱”,它制定了系統各模組應該遵循的標準。因此一個系統中的介面不應該經常改變
抽象類別作為多個子類的共同父類,體現的是模板式設計。抽象類別可以被當成系統實現過程中的中間產品,這個中間產品已經實現了部分功能,但這個產品還不能當成最終產品,必須更進一步的完善,這種完善可能有幾種不同方式。
ü 用法不同
(1)介面裡只能包含抽象方法 ; 抽象類別可以包含普通方法
(2)介面裡不能定義靜態方法 ; 抽象類別可以定義靜態方法
(3)介面裡只能定義靜態常量屬性 ; 抽象類別既包含普通屬性,也可以包含靜態常量屬性
(4)介面不包含構造方法 ; 抽象類別裡構造方法不用於建立對象,是讓子類調用
(5)介面裡不能包含初始化塊 ; 抽象類別可以包含初始化塊
(6)一個類可以實現多個介面 ; 一個只能繼承一個父類,包括抽象類別。