介面定義語法
interface Drawable {
String DEFAULT_COLOR = "RED"; // 隱含 public static final
void draw(); // 隱含 public abstract
default void preview() { // Java 8+ 預設方法
System.out.println("預覽...");
}
static void info() { // Java 8+ 靜態方法
System.out.println("Drawable 介面 v1.0");
}
}
實作介面
class Circle implements Drawable {
@Override public void draw() { System.out.println("畫圓"); }
}
class Rectangle implements Drawable, Serializable { // 多實作
@Override public void draw() { System.out.println("畫矩形"); }
}
介面繼承 (多重繼承)
interface Shape extends Drawable, Cloneable { // 介面可多繼承
double area();
}
搭配抽象類別
abstract class AbstractShape implements Shape {
protected String color;
public AbstractShape(String color) { this.color = color; }
public String getColor() { return color; }
// area() 留給具體子類實作
}
class Triangle extends AbstractShape {
private double a,b,c;
public Triangle(String color, double a,double b,double c) {
super(color); this.a=a; this.b=b; this.c=c;
}
@Override public double area() { /* 海倫公式 */ return 0; }
@Override public void draw() { System.out.println("畫三角形"); }
}
介面 vs 抽象類別 選擇指南
| 場景 | 推薦 | 理由 |
| 定義「是一種」能力、多類無關類別共享行為 | 介面 | 支援多實作、無狀態、Java 8+ 可有預設實作 |
| 定義「是一類」實體、共享狀態/通用邏輯 | 抽象類 | 可有建構子、實例欄位、非抽象方法、模板方法 |
| 需要向舊版相容新增方法 | 介面 (default 方法) | 不破壞現有實作類 |
| 單繼承限制下需組合多種行為 | 介面 + 組合/委派 | 避免繼承層級過深 |
關鍵限制
- 介面欄位隱含
public static final,不可為實例變數。
- 介面方法預設
public,不可 protected/private (Java 9+ 允許 private 方法)。
- 類可實作多個介面,但只能繼承一個父類 (抽象或具體)。