官术网_书友最值得收藏!

3.3 接口

在本章前面的內容中已經介紹過,Java只允許單繼承,即不允許一個類同時繼承多個父類,不過Java中提供了接口,一個類可以同時實現很多個接口,這樣就實現了多重繼承的部分功能。

3.3.1 接口的定義

接口的定義包括接口聲明和接口體。其定義的一般格式如下:

    [public] interface interfaceName[extends listOfSuperInterface] {
          type methodname(parameterlist);
          type constname=value;
    }

其中,接口只能用public限制訪問修飾符修飾,不能使用其他的限制訪問修飾符,extends后可以有多個父接口,這多個父接口之間用逗號隔開。

接口體包括常量定義和方法聲明,這里的方法聲明包含方法名稱、參數列表和返回值類型,但是沒有方法體。看到這里,讀者可能會問,接口不就是抽象類嗎?的確,接口與抽象類有許多相同之處,但是它們之間也有很多的不同點。接口與抽象類是屬于不同的層次,接口是將抽象類提高了一個層次,并給它加上了一些限制和特性。

下面來比較一下接口與抽象類的異同。

相同點:

? 接口與抽象類中都包含有方法聲明,這些方法聲明將在實現接口或繼承抽象類的類中具體實現,否則這些實現接口或繼承抽象類的類還是抽象類。這也是容易把接口和抽象類混淆的主要原因。

? 接口與抽象類中由于都有方法聲明,因此都不能用new來創建對象,但它們都可以去引用實現接口或繼承抽象類的類的實例。

? 接口與抽象類都可以實現繼承,繼承之后子接口就擁有了所有父接口中的方法聲明和常量定義了,抽象類繼承父類后也將用于父類中的所有方法和屬性。

不同點:

? 在抽象類中,方法聲明的前面必須加上abstract關鍵字,而在接口中則不需要。

? 在抽象類中,除了抽象方法之外,也可以定義普通的成員方法和成員變量,而在接口中這是不允許的,接口中只能有方法聲明和常量定義,這是接口和抽象類的本質區別。

? 接口允許多繼承,不但一個接口可以繼承多個父接口,而且實現接口的類也可以同時實現多個接口。

【實例3-9】接口的定義。該實例定義一個用于計算立體幾何圖形體積的接口,因為不同的立體幾何圖形計算體積的方法不同,因此可以在接口中定義一個計算體積的方法的聲明,而在具體的圖形類中實現該接口,并根據各圖形的體積計算公式來定義該方法。接口的具體定義如下:

    01  public interface ThreeD_Object {
    02          float Volume(float x, float y, float z);//定義接口中的抽象方法
    03  }

【代碼說明】在該接口的第2行定義了一個抽象方法Volume。

說明

在接口中只能有方法聲明,不能有方法的具體實現。

3.3.2 接口的實現

接口中的方法聲明需要在某個類中定義實際的代碼,這時我們就稱這個類“實現”了這個接口。關鍵字implements用來表示對接口的實現。如果一個類同時實現了多個接口,則只需在implements后把多個接口名用逗號隔開即可。

接口實現的一般格式如下:

    class <類名> implements <接口名>

例如,下面示例代碼中定義了兩個接口及實現這兩個接口的實現類。

    01  interface A {
    02        void Method1();
    03  }
    04  interface B {
    05        void Method2();
    06  }
    07  class C implements A,B {
    08         public void Method1() {
    09               ……//具體方法定義代碼
    10           }
    11  public void Method2() {
    12               ……//具體方法定義代碼
    13           }
    14  }

【代碼說明】在第8行實現了接口A中的方法,第12行實現了接口B中的方法。

說明

在類中實現接口中的方法聲明時,方法的返回值類型、方法名稱和參數列表必須保持一致,同時要給出方法的具體實現代碼。此外,Java中規定在類中實現的方法都要聲明為public的。

如果在實現接口的類中沒有定義接口中方法的具體實現,那么在這個類中這個方法就將是一個抽象方法,由于這時它位于類中,那么這個類就將成為抽象類。

【實例3-10】接口的實現。

在實例3-9中定義了用于計算立體幾何圖形體積的接口,在實例3-10中根據具體立體幾何圖形分別定義該接口不同的實現類。

首先定義立方體的實現類Cube,具體代碼如下:

    01  class Cube implements ThreeD_Object {
    02         //根據立方體體積計算公式具體定義方法
    03         public float Volume(float x, float y, float z) {
    04              return x*y*z;
    05         }
    06  }

【代碼說明】在第3行定義了ThreeD_Object接口中聲明的Volume()方法,在該方法中具體定義了立方體體積的計算方法。

然后定義圓柱體的實現類Cylinder,具體代碼如下:

    01  class Cylinder implements ThreeD_Object {
    02         //根據圓柱體體積計算公式具體定義方法
    03         public float Volume(float x, float y, float z) {
    04              return x*y*y *z;
    05         }
    06  }

【代碼說明】在第3行定義了ThreeD_Object接口中聲明的Volume()方法。在該方法中具體定義了圓柱體體積的計算方法。

最后定義應用程序類ShowVolume,用來測試實現接口的類,其具體代碼定義如下:

    01  public class ShowVolume {
    02      public static void main(String args[]){
    03           float vol1,vol2;
    04           float PI=3.14159f;
    05           ThreeD_Object obj1=new Cube();       //創建Cube類的對象
    06           ThreeD_Object obj2=new Cylinder()    ;//創建Cylinder類的對象
    07           vol1=obj1.Volume(20.0f, 10.0f, 30.0f); //調用Cube類中實現的接口中的方法
    08           vol2=obj2.Volume(PI, 10.0f, 30.0f);  //調用Cylinder類中實現的接口中的方法
    09           System.out.println("The Volume of cube is:"+vol1);
    10           System.out.println("The Volume of cylinder is:"+vol2);
    11      }
    12  }

【代碼說明】在應用程序類中的第5行和第6行分別實例化一個Cube類和Cylinder類的實例,然后在第7行和第8行通過這兩個實例分別調用了Volume()方法,雖然是同一個方法,但是這兩個方法在不同的類中得到了不同的定義。

【運行結果】最終程序輸出結果如圖3.6所示。

圖3.6 接口實現類中具體方法的執行結果

主站蜘蛛池模板: 天水市| 潮安县| 内江市| 航空| 金川县| 金门县| 阿图什市| 修武县| 固原市| 南安市| 望城县| 丰都县| 裕民县| 怀柔区| 鹤壁市| 万盛区| 襄汾县| 巴林右旗| 平顶山市| 宁南县| 运城市| 锦州市| 太仓市| 大田县| 嘉鱼县| 安溪县| 湖州市| 赣榆县| 二手房| 邯郸市| 和政县| 奉新县| 渭源县| 当阳市| 大同县| 正宁县| 日照市| 伊春市| 曲麻莱县| 祁门县| 色达县|