在軟體工程中,介面是一份「契約」,規範不同開發團隊間的協作方式。Java 的 interface 關鍵字正是這份契約的程式化表達:它定義了一組方法簽名(無方法主體)、常數與巢狀類型,供類別實現或介面繼承。
turn()、changeLanes()、signalTurn() 等控制方法public interface OperateCar {
// 常數宣告(隱含 public static final)
int MAX_SPEED = 200;
// 方法簽名(隱含 public abstract)
int turn(Direction direction, double radius, double startSpeed, double endSpeed);
int changeLanes(Direction direction, double startSpeed, double endSpeed);
int signalTurn(Direction direction, boolean signalOn);
// 更多方法...
}
public class ChevroletCar implements OperateCar {
@Override
public int turn(Direction direction, double radius, double startSpeed, double endSpeed) {
// 雪佛蘭具體實現邏輯
return 0;
}
// 必須實現介面所有方法...
}
Java 類別僅支援單一繼承(extends 一個父類),但可實現多個介面(implements 多個),從而實現「多重型態」:
public interface GroupedInterface extends Interface1, Interface2, Interface3 {
double E = 2.718282; // 常數
void doSomething(int i, double x); // 方法簽名
int doSomethingElse(String s);
}
介面可繼承任意數量的父介面,突破類別單一繼承限制。
public interface Relatable {
// 回傳 1: this > other, 0: 相等, -1: this < other
int isLargerThan(Relatable other);
}
public class RectanglePlus implements Relatable {
public int width = 0;
public int height = 0;
public Point origin;
// 建構子略...
public int getArea() {
return width * height;
}
@Override
public int isLargerThan(Relatable other) {
RectanglePlus otherRect = (RectanglePlus) other;
if (this.getArea() < otherRect.getArea()) return -1;
else if (this.getArea() > otherRect.getArea()) return 1;
else return 0;
}
}
public Object findLargest(Object object1, Object object2) {
Relatable obj1 = (Relatable) object1;
Relatable obj2 = (Relatable) object2;
return (obj1.isLargerThan(obj2) > 0) ? object1 : object2;
}
public Object findSmallest(Object object1, Object object2) {
Relatable obj1 = (Relatable) object1;
Relatable obj2 = (Relatable) object2;
return (obj1.isLargerThan(obj2) < 0) ? object1 : object2;
}
public boolean isEqual(Object object1, Object object2) {
Relatable obj1 = (Relatable) object1;
Relatable obj2 = (Relatable) object2;
return obj1.isLargerThan(obj2) == 0;
}
這些方法適用於所有實現 Relatable 的類別,無關繼承體系,展現介面多型威力。
// 原介面
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
}
// 新增方法後,所有舊實現類別編譯失敗
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
boolean didItWork(int i, double x, String s); // 新增
}
public interface DoItPlus extends DoIt {
boolean didItWork(int i, double x, String s);
}
DoIt,新用戶升級至 DoItPlus