Java介面教學

Java介面教學

 介面是什麼?

Java中的介面定義了一個引用類型來創建抽象概念。 介面由類實現,它是用來提供概念的實現。

在Java 8之前,一個介面只能包含抽象方法。 Java 8允許介面具有實現的靜態和默認方法。

介面通過抽象概念定義不相關類之間的關係。例如,可以創建一個Person類來表示一個人,也可以創建一個Dog類來表示一只狗。

人和狗都可以走路。 這裏的走路是一個抽象的概念。 狗可以走路,人也是走路。這裏可以創建一個名為Walkable的介面來表示走路這個概念。然後在Person類和Dog類中各自實現Walkable概念(如:實現怎麼走路)。 Person類實現了Walkable介面以人的方式走路(如:用兩條腿走路)。 Dog類可以實現Walkable介面以狗的方式走路(如:用四條腿走路)。

示例-1

下麵將使用一個例子來說明為什麼需要介面。
假設Person類有一個walk()方法。
在相同的包下創建一個介面檔 - Walkable.java 並使用以下代碼 -

public interface Walkable {
  void walk(); // 介面中只有一個方法

}

在相同的包下創建一個主類 -Main.java 並使用以下代碼 -



class Person implements Walkable {
    public Person() {
    }

    public void walk() {
        System.out.println("人走路:使用兩條腿足路.");
    }
}

class Dog implements Walkable {
    public Dog() {
    }

    public void walk() {
        System.out.println("狗走路:使用四條腿足路.");
    }
}

public class Main {
    public static void main(String[] args) {
        Walkable[] w = new Walkable[2];
        w[0] = new Person();
        w[1] = new Dog();
        w[0].walk();
        w[1].walk();
        // 或者

        // Person p = new Person();
        // p.walk();
    }
}

上面的代碼輸出結果如下 -

人走路:使用兩條腿足路.
狗走路:使用四條腿足路.

類可以在其聲明中使用關鍵字implements實現一個或多個介面。通過實現一個介面,類保證它將為介面中聲明的所有方法提供一個實現,或者類將自己聲明為抽象。
如果一個類實現了Walkable介面,它必須提供walk()方法的具體實現。

像類一樣,介面定義了一個新的引用類型。當定義一個新的介面(例如,Walkable)時,定義一個新的參考介面類型。
以下聲明有效:

Walkable  w;  // w  is a  reference variable of  type   Walkable

但是不能創建介面類型的對象,因為介面是定義抽象概念。 以下代碼無效,編譯會出錯:

new Walkable(); // A  compile-time error

只能為類類型創建對象,但是可以使用一個介面類型變數來引用那些類實現該介面的任何對象。
如:PersonDog類都實現了Walkable介面,所以Walkable類型的引用變數可以引用這兩個類的對象。如下代碼是沒有問題的:

Walkable  w1  = new Person(); // OK
Walkable  w2  = new Dog();     // OK

可以使用它的引用類型變數訪問介面的任何成員。 由於Walkable介面只有一個成員,也就是walk()方法,所以這裏可以編寫如下代碼:

// Let  the   person  walk
w1.walk();
// Let  the   dog walk
w2.walk();

當調用w1walk()方法時,它調用Person對象的walk()方法,因為w1指的是Person對象。當調用w2walk()方法時,它調用Dog對象的walk()方法,因為w2指的是Dog對象。

當使用介面類型的引用變數調用方法時,它將調用它所引用的對象的方法。

實例-2

下麵的代碼創建了一個方法來使用介面參數類型。

public class Main{
  public static void main(String[] args) {
    Walkable[] w = new Walkable[2];
    w[0] = new Person();
    w[1] = new Dog();

    Walkables.letThemWalk(w);
  }
}

class Walkables {
  public static void letThemWalk(Walkable[] list) {
    for (Walkable w : list) {
      w.walk();
    }
  }
}

聲明介面

聲明介面的一般語法是 -

<modifiers> interface <interface-name>  {
    Constant-Declaration
    Method-Declaration
    Nested-Type-Declaration
}

介面聲明以修飾符列表開頭,也可以為空(不寫)。像類一樣,一個介面可以有一個公共或包級別的範圍。
關鍵字public用於指示介面具有公共範圍。缺少範圍(不使用)修飾符表示介面具有包級別作用域。 具有包級別作用域的介面只能在其包的成員內引用。
關鍵字interface用於聲明介面,後面是介面的名稱。

介面的名稱必須是有效的Java識別字。介面主體跟在其名稱後面並放在大括弧內。介面的主體可以為空。 以下是最簡單的介面聲明:

package com.zaixian;

interface Updatable  {
    // The interface body  is empty
}

像類一樣,一個介面有一個簡單的名稱和一個完全限定名。關鍵字interface後面的識別字是其簡單名稱。介面的完全限定名稱通過使用其包名稱和用點分隔的簡單名稱組成。

在上面的示例中,Updatable是簡單的名稱,com.zaixian.Updatable是完全限定名稱。使用介面的簡單和完全限定名的規則與類的規則相同。
下麵的代碼聲明一個名為ReadOnly的介面。 它有一個公共(public)範圍。

package  com.zaixian;

public interface  ReadOnly {
    // The interface body  is empty
}

介面聲明總是抽象的,無論是否明確聲明它為抽象。

標記介面

標記介面是沒有成員的介面。標記介面用來標記類具有特殊含義。

interface  Shape {
}
class Circle implements Shape{
}

Shape c = new Circle();

if (c instanceof Shape)  {
   System.out.println("Using a  Shape object");
}

Java API有許多標記介面。如:java.lang.Cloneablejava.io.Serializablejava.rmi.Remote都是標記介面。

功能介面

僅具有一個抽象方法的介面被稱為功能介面。

多態性 - 一個對象,許多視圖

多態性是指對象具有多種形式的能力。多態性是對象提供其不同視圖的能力。使用介面使得我們可以創建一個多態對象。


上一篇: Java異常用法 下一篇: Java介面字段