面向物件程式設計進階---介面
介面
介面是另一種定義資料型別的方式。它和類非常相似的。
相同之處:都有成員變數和成員方法
也可以形成繼承關係
不同之處:介面中的屬性都是常量(final)
介面中的方法是抽象方法(沒有方法體)
引入介面的原因:Java只支援單重繼承,每個類只能有一個超類。但實際應用中有時候需要多重繼承--使用介面,一個類可以實現多個介面。
介面的定義
[public] (表示可以被不同包中的類或介面使用,預設時具有包內可訪問性) interface(interface關鍵字表示介面) 介面名(任意有效識別符號 ) [extends (介面支援多繼承,多個父介面之間用逗號分隔)父介面1,
[public][static][final] 資料型別 屬性名=常量值;
[public abstract] 返回值型別 方法名([形參表]);
介面的屬性必須用public static final修飾,是系統預設的,可部分省略或全部省略,但一般都寫出final。
int MAX_SIZE = 50; 等價於
public static final int MAX_SIZE = 50;
介面的方法預設為public abstract,一般不寫修飾符,可省略--介面中的方法都是抽象方法。
例5.19 介面的定義。
public interface Figure {
final double pi=3.14;
abstract void area();
}
實現介面
介面定義後不能直接建立物件,必須由類實現介面後建立類的物件。每個類只能繼承一個基類,但可以實現多個介面。類定義形式如下:
[public] class 類名 extends 基類 implements (可實現多個介面,多個介面之間用逗號分隔
)介面1,…{
//類體
}(注意:類實現介面,就繼承了介面中的所有成員變數和成員方法。由於介面中的方法都是抽象的,因此實現介面的類必須重寫這些方法。)
public class Circle implements Figure{
double radius;
public Circle(double r){
radius=r;
}
public void area(){
System.out.println("圓的面積="+pi*radius*radius);
}
}
注意:
實現介面中的抽象方法時,除去掉關鍵字abstract外,方法頭必須和介面定義中的方法頭完全相同,並且public修飾符不能省略。
如果類實現了多個介面,必須重寫這些介面中的所有方法。
介面不是類,不能使用new例項化介面,但可以宣告介面變數。介面變數可以指向一個實現了該介面的類的物件,例如,
Shape s=new Shape(); //錯
Shape s=new Circle(); //對
可以使用instanceof來判斷物件是否實現了某個介面。
雖然可以使用介面變數來引用實現介面類的物件,但這種引用只能引用介面的成員,否則會發生編譯錯誤。
例如,class Rectangle implements Shape{}
Shape s;
s=new Circle(); s.area();
s=new Rectangle(); s.area();
強調:一個介面定義一個協定,實現介面的類必須遵守其協定。介面最適合為不相關的類提供通用功能,利用介面提供的方法,程式可以多型地處理這些完全不同的類的物件。
介面的繼承
介面具有多重繼承的特點,即一個介面可以有多個父介面。新的子介面繼承所有父介面的全部方法和常量。介面繼承的格式為:
[public] interface 子介面 extends 父介面1,父介面2,…{
//靜態屬性;
//抽象方法;
}
介面和抽象類
介面和抽象類很像,它們都具有如下特徵:
介面和抽象類都不能被例項化,它們都位於繼承樹的頂端,用於被其他類實現和繼承。
介面和抽象類都可以包含抽象方法,實現介面或繼承抽象類的普通子類都必須實現這些抽象方法。
區別
設計目的不同
介面體現的是一種規範,類似於整個系統的“總綱”,它制定了系統各模組應該遵循的標準 。因此一個系統中的介面不應該經常改變
抽象類作為多個子類的共同父類,體現的是模板式設計。抽象類可以被當成系統實現過程中的中間產品,這個中間產品已經實現了部分功能,但這個產品還不能當成最終產品,必須更進一步的完善,這種完善可能有幾種不同方式。
用法不同
(1)接口裡只能包含抽象方法
(2)接口裡不能定義靜態方法
(3)接口裡只能定義靜態常量屬性
(4)介面不包含構造方法
(5)接口裡不能包含初始化塊
(6)一個類可以實現多個介面
(1)抽象類可以包含普通方法。
(2)抽象類可以定義靜態方法
(3)抽象類既包含普通屬性,也可以包含靜態常量屬性
(4)抽象類裡構造方法不用於建立物件,是讓子類呼叫
(5)抽象類可以包含初始化塊
(6)一個只能繼承一個父類