在 Java 中有另外一種做抽象類別的方法是使用介面 (Interface)。介面 (Interface) 是一種完全抽象的類別,其所有內部的方法(method)都是抽象方法。
最重要的原因是 Java 中的類別不允許多重繼承,因此每個類別都只能有一種父類別。
舉例來說,如果有一個類別為番茄,繼承水果類的屬性與方法,與此同時,番茄也可以是蔬菜,如果我也希望加入一下蔬菜的料理方式,但卻不被允許以下面的方式繼承:
// 同時繼承兩個類別是不被允許的
class 番茄 extends 水果,蔬菜{
...
}
也就是說若物件有其他共通的方法,無法透過繼承另一種類別或抽象類別來取得。那該怎麼做呢?
我們可以使用介面 (Interface) 來提供這些方法的原型來供物件來實作。
// 繼承了水果類別,同時也需要實作出蔬菜的介面
class 番茄 extends 水果 implements 蔬菜{
...
}
如此一來就可以讓番茄繼承的水果類別也需要把蔬菜的料理方式實作出來。那該如何做出介面呢?
介面可以被視為一種特別的抽象類別,可以使用 Interface 關鍵字作宣告,跟抽象類別一樣,不能用於被實作出物件 (objects),因此也無需定義建構子(constructor)。宣告方式如下:
// 舉例如:
public interface Vegetable{ // 修飾符 interface 介面名稱
...
}
在介面內部的所有方法默認都是公開抽象 (public abstract method) 方法 ,只需要定義方法的原型且不需要加 abstract 或 public 等修飾符。當 implement 介面時,其中所有的方法都需要被覆寫 (Override)。
public interface Vegetable{ // 修飾符 interface 介面名稱
void fried(); // 炒
void grill(); // 烤
}
在介面中的所有屬性預設修飾為 public、static 和 final,因此可以省略不寫且都必須有初始值。因介面中的屬性皆具有 final 的不可修改特性,故通常只用作常數的使用。
public interface Vegetable{
String origin = "Taiwan";
}
要繼承介面需要用到 implement 關鍵字,在 Java 中一個類別可以實作(implement) 超過一個介面。以下為建立類別 Tomato 繼承 Fruits 與實作了介面 Vegetable 的範例程式碼:
// 定義抽象類別 Fruits
public abstract class Fruits {
abstract void eat();
}
// 定義介面類 Vegetable
public interface Vegetable{
void fried();
void grill();
}
// 類別 Tomato 繼承 Fruits 與實作了介面 Vegetable
class Tomato extends Fruits implements Vegetable{
// 實作 Fruits 中的方法
public void eat(){
...
}
// 實作 Vegetable 中的方法
public void fried(){
...
};
public void grill(){
...
};
}
介面無法實體化為物件,不過還是可以作為一種資料型別 (data type)
以作 Polymorphism 使用,讓類別的使用更具有彈性。
Tomato tomato = new Tomato();
Fruits tomato = new Tomato();
Vegetable tomato = new Tomato();