Java 接口方法

2018-01-19 16:50 更新

Java面向?qū)ο笤O(shè)計 - Java接口方法

方法聲明

您可以在接口中聲明三種類型的方法:

  • 抽象方法
  • 靜態(tài)方法
  • 默認方法

在Java 8之前,您只能在接口中聲明抽象方法。修飾符static和default用于分別聲明靜態(tài)和默認方法。

缺少靜態(tài)和默認修飾符使得方法抽象。

以下是具有所有三種類型方法的接口的示例:

interface AnInterface {
  // An abstract method
  int m1();

  // A static method 
  static int m2()  {
    // The method  implementation goes  here
  }

  // A default method
  default int m3() {
    // The method implementation goes here
  }
}

抽象方法聲明

接口中的所有方法聲明都是隱式抽象和公開的,除非它們聲明為static或default。

接口中的抽象方法沒有實現(xiàn)。

抽象方法的主體總是由分號表示,而不是一對大括號。

下面的代碼聲明一個名為Player的接口:

public interface Player {
  public abstract void play();

  public abstract void stop();

  public abstract void forward();

  public abstract void rewind();
}

播放器界面是音頻/視頻播放器的規(guī)范。

真實的播放器,例如DVD播放器,將通過實現(xiàn)播放器接口的所有四種方法來提供該規(guī)范的具體實現(xiàn)。

在接口中的方法聲明中使用抽象和公共關(guān)鍵字是多余的。

上面的Player接口的聲明可以改寫如下,而不改變其含義:

public interface  Player {
    void  play(); 
    void  stop(); 
    void  forward(); 
    void  rewind();
}

接口中的抽象方法聲明可以包括參數(shù),返回類型和throws子句。

public interface NewPlayer {
  boolean play(int account) throws AccountNotFoundException;

  boolean stop(double amount);

  boolean forward(double amount) throws InsufficientBalanceException;

  double rewind();
}

來自接口的抽象方法由實現(xiàn)接口的類實現(xiàn),類重寫它們以提供實現(xiàn)。

接口中的抽象方法不能聲明為final。

類可以聲明接口final的重寫方法,表示子類不能重寫該方法。

靜態(tài)方法聲明

從Java 8,我們可以在接口中有靜態(tài)方法。

靜態(tài)方法包含靜態(tài)修飾符,并且是隱式公開的。

我們可以重新定義Walkable接口以包括letThemWalk()方法。

interface Walkable {
  // An abstract method 
  void walk();

  // A static convenience method
  public static void letThemWalk(Walkable[] list) {
    for (int i = 0; i < list.length; i++) {
      list[i].walk();
    }
  }
}

您可以使用點表示法使用接口的靜態(tài)方法。

<interface-name>.<static-method>

與類中的靜態(tài)方法不同,接口中的靜態(tài)方法不會通過實現(xiàn)類或子接口來繼承。

從另一個接口繼承的接口稱為子接口。只有一種方法來調(diào)用接口的靜態(tài)方法:使用接口名稱。

必須使用MyInterface.myStaticMethod()調(diào)用接口MyInterface的靜態(tài)方法myStaticMethod()。

我們可以使用方法的非限定名稱myStaticMethod()來調(diào)用它僅在接口的主體中,或者當(dāng)我們使用靜態(tài)import語句導(dǎo)入方法時。

默認方法聲明

接口中的默認方法使用modifier default來聲明。默認方法是在Java 8中添加新功能。

默認方法為實現(xiàn)接口的類提供了一個默認實現(xiàn),但不重寫默認方法。

假設(shè),我們有以下接口。

interface Shape{
  void setX(double x);
  void setY(double y);
  double getX();
  double getY();
}

下面的代碼顯示了實現(xiàn)Shape接口的Circle。

class Circle implements Movable {
  private double x;
  private double y;

  public Circle() {
  }

  public Circle(double x, double y) {
    this.x = x;
    this.y = y;
  }

  public void setX(double x) {
    this.x = x;
  }

  public void setY(double y) {
    this.y = y;
  }

  public double getX() {
    return x;
  }

  public double getY() {
    return y;
  }

  public String toString() {
    return "Circle(" + x + ", " + y + ")";
  }
}

如果我們向Shape添加一個新方法如下。

interface Shape {
  void setX(double x);

  void setY(double y);

  double getX();

  double getY();

  void move(double deltaX, double deltaY);
}

在Java 8之前,新方法move()是一個抽象方法。所有實現(xiàn)Shape接口的類都必須提供新方法的實現(xiàn)。

實現(xiàn)Shape接口的Pen類將不再編譯,除非將新方法添加到這些類中。

在Java 8之前,在將接口分發(fā)給公共接口之后,不能在不中斷現(xiàn)有代碼的情況下向接口添加方法是不可能的。

Java接口默認方法是接受的接口解決方案??梢詫⒛J方法添加到現(xiàn)有接口,并為該方法提供默認實現(xiàn)。

所有實現(xiàn)該接口的類都將繼承默認實現(xiàn),因此不會破壞它們。類可以選擇重寫默認實現(xiàn)。

默認方法使用關(guān)鍵字 default 聲明。默認方法不能聲明為abstract或static。它必須提供一個實現(xiàn)。否則,將發(fā)生編譯時錯誤。

以下代碼使用默認方法更改Shape接口。

interface Movable {
  void setX(double x);

  void setY(double y);

  double getX();

  double getY();

  // A default method
  default void move(double deltaX, double deltaY) {
    double newX = getX() + deltaX;
    double newY = getY() + deltaY;
    setX(newX);
    setY(newY);
  }
}

以下項目列出了類中的具體方法和接口中的默認方法之間的相似點和差異。

兩者都以相同的方式訪問關(guān)鍵字 this 。 關(guān)鍵字 this 是調(diào)用該方法的對象的引用。

類中的一個具體方法可以訪問類的實例變量。

默認方法不能訪問實現(xiàn)接口的類的變量的實例。

默認方法可以訪問接口的其他成員。

兩種類型的方法都可以使用它們的參數(shù)。

兩個方法都可以有一個throws子句。

接口中的嵌套類型聲明定義了一個新的引用類型。

我們可以將一個類,接口,枚舉和注釋聲明為嵌套類型。

在接口內(nèi)聲明的接口/類稱為嵌套接口/類。

接口和類定義新的引用類型,因此做嵌套接口和嵌套類。

嵌套接口始終通過其封裝接口訪問。

我們還可以在接口中聲明一個嵌套類。

具有嵌套類和常量字段的作業(yè)接口。

interface Task {
  class EmptyTask implements Task {
    private EmptyTask() {
    }
    public void runJob() {
      System.out.println("Empty...");
    }
  }
  // A constant field
  Task EMPTY_JOB = new EmptyTask();
  void runJob();
}

public class Main {
  public static void main(String[] args) {
    submitJob(Task.EMPTY_JOB);
  }
  public static void submitJob(Task job) {
    job.runJob();
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號