1. 程式人生 > >面向物件程式設計進階---介面

面向物件程式設計進階---介面

介面

介面是另一種定義資料型別的方式。它和類非常相似的。

相同之處:都有成員變數和成員方法

             也可以形成繼承關係

不同之處:介面中的屬性都是常量(final

             介面中的方法是抽象方法(沒有方法體)

引入介面的原因:Java只支援單重繼承,每個類只能有一個超類。但實際應用中有時候需要多重繼承--使用介面,一個類可以實現多個介面。

介面的定義

[public] (表示可以被不同包中的類或介面使用,預設時具有包內可訪問性) interface(interface關鍵字表示介面)  介面名(任意有效識別符號 ) [extends (介面支援多繼承,多個父介面之間用逗號分隔)父介面1,

父介面2,…]{

       [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)一個只能繼承一個父類