C語言中文網 目錄

Java接口:接口的定義和接口的實現,定義接口,實現接口

接口類似于類,但接口的成員沒有執行體,它只是方法、屬性、事件和索引符的組合而已。接口不能被實例化,接口沒有構造方法,沒有字段。在應用程序中,接口就是一種規范,它封裝了可以被多個類繼承的公共部分。

定義接口

接口繼承和實現繼承的規則不同,一個類只有一個直接父類,但可以實現多個接口。Java 接口本身沒有任何實現,只描述 public 行為,因此 Java 接口比 Java 抽象類更抽象化。Java 接口的方法只能是抽象的和公開的,Java 接口不能有構造方法,Java 接口可以有 public、Static 和 final 屬性。

接口把方法的特征和方法的實現分隔開來,這種分隔體現在接口常常代表一個角色,它包裝與該角色相關的操作和屬性,而實現這個接口的類便是扮演這個角色的演員。一個角色由不同的演員來演,而不同的演員之間除了扮演一個共同的角色之外,并不要求其他的共同之處。

接口對于其聲明、變量和方法都做了許多限制,這些限制作為接口的特征歸納如下:
  • 具有 public 訪問控制符的接口,允許任何類使用;沒有指定 public 的接口,其訪問將局限于所屬的包。
  • 方法的聲明不需要其他修飾符,在接口中聲明的方法,將隱式地聲明為公有的(public)和抽象的(abstract)。
  • 在 Java 接口中聲明的變量其實都是常量,接口中的變量聲明,將隱式地聲明為 public、static 和 final,即常量,所以接口中定義的變量必須初始化。
  • 接口沒有構造方法,不能被實例化。例如:
public interface A
{
    publicA(){…}    //編譯出錯,接口不允許定義構造方法
}
  • 一個接口不能夠實現另一個接口,但它可以繼承多個其他接口。子接口可以對父接口的方法和常量進行重寫。例如:
public interface Student!nterface extends PeopleInterface
{
    //接口 StudentInterface 繼承 PeopleInterface
    int age=25;    //常量age重寫父接口中的age常量
    void getInfo();    //方法getInfo()重寫父接口中的getInfo()方法
}

Java 接口的定義方式與類基本相同,不過接口定義使用的關鍵字是 interface,接口定義由接口聲明和接口體兩部分組成。語法格式如下:
[public] interface interface_name [extends interface1_name[, interface2_name,…]]
{
    //接口體,其中可以包含定義常量和聲明方法
    [public] [static] [final] type constant_name=value;    //定義常量
    [public] [abstract] returnType method_name(parameter_list);    //聲明方法
}

其中,public 表示接口的修飾符,當沒有修飾符時,則使用默認的修飾符,此時該接口的訪問權限僅局限于所屬的包;interfaCe_name 表示接口的名稱,可以是任何有效的標識符;extends 表示接口的繼承關系;interface1_name 表示要繼承的接口名稱;constant_name 表示變量名稱,一般是 static 和 final 型的;returnType 表示方法的返回值類型;parameter_list 表示參數列表,在接口中的方法是沒有方法體的。

提示:如果接口本身被定義為 public,則所有的方法和常量都是 public 型的。

例如,定義一個接口 MyInterface,并在該接口中聲明常量和方法,如下:
public interface Mylnterface
{    //接口myInterface
    String name;    //不合法,變量name必須初始化
    int age=20;    //合法,等同于 public static final int age=20;
    void getInfo();    //方法聲明,等同于 public abstract void getInfo();
}

實現接口

接口被定義后,一個或者多個類都可以實現該接口,這需要在實現接口的類的定義中包含 implements 子句,然后實現由接口定義的方法。實現接口的一般形式如下:
<public> class <class_name> [extends superclass_name] [implements interface[, interface…]]
{
    //主體
}

如果一個類實現多個接口,這些接口需要使用逗號分隔。如果一個類實現兩個聲明了同樣方法的接口,那么相同的方法將被其中任一個接口使用。實現接口的方法必須聲明為 public,而且實現方法的類型必須嚴格與接口定義中指定的類型相匹配。

例 1

在程序的開發中,需要完成兩個數的求和運算和比較運算功能的類非常多。那么可以定義一個接口來將類似功能組織在一起。下面創建一個示例,具體介紹接口的實現方式。

(1) 創建一個名稱為 IMath 的接口,代碼如下:
public interface IMath
{
    public int sum();    //完成兩個數的相加
    public int maxNum(int a,int b);    //獲取較大的數
}

(2) 定義一個 MathClass 類并實現 IMath 接口,MathClass 類實現代碼如下:
public class MathClass implements IMath
{
    private int num1;    //第 1 個操作數
    private int num2;    //第 2 個操作數
    public MathClass(int num1,int num2)
    {
        //構造方法
        this.num1=num1;
        this.num2=num2;
    }
    //實現接口中的求和方法
    public int sum()
    {
        return num1+num2;
    }
    //實現接口中的獲取較大數的方法
    public int maxNum(int a,int b)
    {
        if(a>=b)
        {
            return a;
        }
        else
        {
            return b;
        }
    }
}

在實現類中,所有的方法都使用了 public 訪問修飾符聲明。無論何時實現一個由接口定義的方法,它都必須實現為 public,因為接口中的所有成員都顯式聲明為 public。

(3) 最后創建測試類 NumTest,實例化接口的實現類 MathClass,調用該類中的方法并輸出結果。該類內容如下:
public class NumTest
{
    public static void main(String[] args)
    {
        //創建實現類的對象
        MathClass calc=new MathClass(100, 300);
        System.out.println("100 和 300 相加結果是:"+calc.sum());
        System.out.println("100 比較 300,哪個大:"+calc.maxNum(100, 300));
    }
}

程序運行結果如下所示。
100 和 300 相加結果是:400
100 比較 300,哪個大:300

在該程序中,首先定義了一個 IMath 的接口,在該接口中只聲明了兩個未實現的方法,這兩個方法需要在接口的實現類中實現。在實現類 MathClass 中定義了兩個私有的屬性,并賦予兩個屬性初始值,同時創建了該類的構造方法。因為該類實現了 MathClass 接口,因此必須實現接口中的方法。在最后的測試類中,需要創建實現類對象,然后通過實現類對象調用實現類中的方法。

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户