Java學習之介面概念

忘塵天外天發表於2017-07-21

  Java語言只支援單重繼承,不支援多繼承,即一個類只能有一個父類。但是在實際應用中,又經常需要使用多繼承來解決問題。為了解決該問題,Java語言提供介面來實現類的多繼承問題。

  介面(英文interface),,在Java 程式語言中是一個抽象型別,是抽象方法的集合,介面通常以 interface 來宣告,一個類通過繼承介面的方式,,從未來繼承介面的抽象方法。介面並不是類,建立介面的方式和類很相似,但是他們屬於不同的概念,類描述物件的屬性和方法,介面則包含要實現的方法。除非實現介面的類是抽象類,否則該實現類要重寫介面中所有方法。介面無法被例項化,但可以被實現,一個實現介面的類,必須實現介面內描述的所有方法。否則就必須宣告為抽象類。另外,在Java中,介面型別可以用來宣告一個變數,他們可以成為一個空指標,或是被繫結在一個以此介面實現的物件

1.介面的定義

  使用interface來定義一個介面。介面定義與類的定義相似,也是分為介面的宣告和介面體,其中介面體由變數定義和方法定義兩部分組成。定義介面的基本語法格式如下:

  [修飾符]interface  介面名  [extends  父介面名列表]{       

      [public] [static] [final]  變數;             

      [public] [abstract]   方法;                      

    }                                                                                        

引數 說明
   修飾符 可選引數,用於指定介面的訪問許可權,可選值為public。如果省略則使用預設的訪問許可權
   介面 必選引數,用於指定介面的名稱,介面名必須是合法的Java識別符號,一般情況下,要求首字母大寫
   extends父介面名列表 可選引數,用於指定要定義的介面繼承於哪個介面。當使用extends關鍵字時,父介面名為必選引數
 方法     介面中的方法只有定義而沒有實現

 

 

 

 

 

 

 

 

定義一個用於計算的介面,在該介面中定義一個常量PI 和兩個方法。

public interface CalculateInface {
  public static final double PI = 3.14159; //定義用於表示圓周率的常量PI

  public double getCircumference(double r); //定義一個用於計算周長的方法

  public double getArea(double r); //定義一個用於計算面積的方法
}

注意: 與Java 類檔案一樣,介面檔案的檔名必須與介面名相同。

2.介面的實現

介面在定義後,就可以在類中實現該介面。在類中實現介面可以使用 implements 關鍵字,基本語法格式如下:

  [修飾符] class <類名>  [extends  父類名] implements  介面列表{                                      

  }                                                                                                                                   

實現介面的語法格式的引數說明:

 

引數 說明
   修飾符   可選引數,用於指定類的訪問許可權,可選值為public、abstract 和 final
   類名   必選引數,用於指定類的名稱,類名必須是合法的Java識別符號,一般情況下,要求首字母大寫
   extends父類名列表   可選引數,用於指定要定義的類繼承於哪個父類。當使用extends關鍵字時,父類名為必選引數
 implements介面列表   當介面列表中存在多個介面名時,各個介面之間是用逗號分隔

 

 

 

 

 

 

 

 

 

  在類中實現介面時,方法名、返回值型別、引數的個數及型別必須與介面中的完全一致,並且必須實現介面中的所有方法。

  編寫一個Circle的類,實現上文定義的介面 CalculateInface 。

public class Circle implements CalculateInface{

  public double getCircumference(double r) {
  double circumference = 2*PI*r ; //計算圓周長並返回
  return circumference;
  }

  public double getArea(double r) { //計算圓的面積並返回
  double area = PI*r*r ;
  return area;
  }
}

  在類的繼承中,只能做單重繼承,而實現介面時,一次則可以實現多個介面,每個介面間使用逗號“,”分隔,這是就可能出現變數或方法衝突的情況。解決該問題時,如果變數衝突,則需要明確指定變數的介面,可以通過“介面名.變數”實現。如果出現方法衝突,則只要實現一個方法即可。

介面與類相似點:

  • 一個介面可以有多個方法。
  • 介面檔案儲存在以.java 結尾的檔案中。
  • 介面的位元組碼檔案儲存在以.class 結尾的檔案中。
  • 介面相應的位元組碼檔案必須在與包名稱相匹配的目錄中。

介面與類的區別:

  • 介面不能用於例項化物件。
  • 介面沒有構造方法。
  • 介面中的方法必須全是抽象方法。
  • 介面不能包含成員變數,除了static 和 final 變數。
  • 介面不是被類 繼承,而是要被類 實現。
  • 介面支援多繼承(包括被類或介面)。

介面的特性 :

  • 介面中每一個方法都是隱式抽象的,介面中的方法會被隱式指定為 public  abstract(只能是 public  abstract,其他的修飾符都會報錯)。
  • 介面中可以含有變數,但是變兩個會被隱式的指定為public  static final 變數(並且只能是 public,若用private  會編譯報錯的)。
  • 介面中的方法是不能在介面中實現的,只能由實現的介面的類來實現介面中的方法

 

 

相關文章