介面Interface

什麼是Interface?

介面(Interface)可以想成是「功能」,但功能的內容由實作(implements)的類別自己去完成。 介面跟繼承不相關,只在乎有沒有實作(implements)介面(Interface)。

建立介面Interface

使用關鍵字interface來宣告這是一個介面(Interface),這個介面(Interface)的名字是Callback。

1
2
public interface Callback {
}

Interface只有常數與抽象方法

介面(Interface)只有常數,沒有變數。
介面(Interface)只有抽象方法(Abstract method),不是抽象方法不能放在介面(Interface)中。

常數

常數就是永恒不變的值,介面(Interface)的常數存取權限一定是public,只能是final。

可以省略public final,編譯會自動加上。

1
2
3
4
5
public interface Callback {
  public final int ERR_CODE = 404;
  // 上面這句與以下相等,二者是相同意思。
  // int ERR_CODE = 404;
}

抽象方法

抽象「方法」存取權限一定是public。
public、abstract可以省略,編譯器會自動加上。

1
2
3
4
5
public interface Callback {
  void sendMessage(int msg);
  // 上面這句與以下相等,二者是相同意思。
  // public abstract void sendMessage(int msg);
}

實作Interface

實作(implements)介面(Interface)的類別就一定要覆寫(Override)介面(Interface)的抽象方法(Abstract method),否則編譯器會產生錯誤。

使用implements關鍵字實作Callback介面,並且一定要覆寫(Override)抽象方法sendMessage()

1
2
3
4
public class Player implements Callback{
  @Override
  public void sendMessage(int msg) {}
}

實作多個Interface

implements Callback, Runnable
以上語法使用逗號隔開不同介面,Callback, Runnable都是介面(Interface)。

1
2
3
4
5
6
7
8
9
public class Player implements Callback, Runnable{
  // 覆寫Callback介面的sendMessage()方法
  @Override
  public void sendMessage(int msg) {}

  // 覆寫Runnable介面的run()方法
  @Override
  public void run() {}
}

介面的範例

建立一個Operator運算元的介面(Interface),介面中有計算的方法calculate(),由實作此介面的類別去完成。

Operator.java

1
2
3
4
5
6
7
// 運算元
public interface Operator {
  /**
   * 計算功能
   */
  int calculate(int x, int y);
}

加法運算元,實作Operator介面,覆寫(Override)calculate()方法

1
2
3
4
5
6
7
8
9
public class Add implements Operator{
  /***
   * 實作加法計算
   */
  @Override
  public int calculate(int x, int y) {
  return x + y;
  }
}

減法運算元,實作Operator介面,覆寫(Override)calculate()方法

1
2
3
4
5
6
7
8
9
public class Minus implements Operator{
  /***
   * 實作減法計算
   */
  @Override
  public int calculate(int x, int y) {
  return x - y;
  }
}

乘法運算元,實作Operator介面,覆寫(Override)calculate()方法

1
2
3
4
5
6
7
8
9
public class Multiply implements Operator{
  /***
   * 實作乘法計算
   */
  @Override
  public int calculate(int x, int y) {
  return x * y;
  }
}

計算機,注意!calculate的第1個參數是Operator介面,也就是只要有實作Operator的類別(加法運算元、減法運算元、乘法運算元)都可以丟進去。

1
2
3
4
5
6
7
8
9
10
11
12
public class Calculator {
  /**
   * 計算
   * @param operator 運算元
   * @param x
   * @param y
   * @return
   */
  public int calculate(Operator operator, int x, int y) {
  return operator.calculate(x,y);
  }
}

主程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  public static void main(String[] args) {
  // 建立計算機
  Calculator calculator = new Calculator();
  int x = 10;
  int y = 5;
  // 加法,第1個參數把實作Operator介面的Add類別丟進去
  int add_result = calculator.calculate(new Add(), x, y);
  System.out.println(x + "+" + y + " = " + add_result);

  // 減法,第1個參數把實作Operator介面的Minus類別丟進去
  int minus_result = calculator.calculate(new Minus(), x, y);
  System.out.println(x + "-" + y + " = " + minus_result);

  // 乘法,第1個參數把實作Operator介面的Multiply類別丟進去
  int multiply_result = calculator.calculate(new Multiply(), x, y);
  System.out.println(x + "*" + y + " = " + multiply_result);
  }
10+5 = 15
10-5 = 5
10*5 = 50

介面的多型

由上面例子發現,Operator介面可以是Add,可以是Minus、Multiply,一個介面有多種類型,類別只要實作Operator介面,我們就會說這個類別就是Operator介面。

results matching ""

    No results matching ""