本文系統整理 Java 介面定義規則、抽象類與介面組合模式、枚舉類型、套件管理、JAR 打包與 Manifest 主類別配置,附完整代碼範例與命令列操作流程。
public abstract 修飾方法 (Java 8+ 可 default/static 方法,Java 9+ 可 private 方法)。public static final (常量),必須初始化。implements 實現介面,**必須實現所有抽象方法** (除非類也是 abstract)。interface C extends A, B)。// 1. 抽象類實現介面 (部份實現,留給子類完成)
interface Clothing {
void calcArea(); void getColor(); void getDate();
int SIZE = 1;
}
abstract class Frock implements Clothing { // 抽象類可不完全實現介面
public String toString() { return "red"; }
// calcArea/getColor/getDate 留給具體子類
}
// 2. 具體類繼承抽象類 + 實現多介面
class Shirt extends Frock implements Clothing, Serializable {
int age;
@Override public String toString() { return super.toString() + age; }
@Override public void calcArea() { System.out.println("...eat1"); }
@Override public void getColor() { System.out.println("...eat2"); }
@Override public void getDate() { System.out.println("...eat3"); }
}
// 3. 多型應用
public class Test {
public static void main(String[] args) {
Frock f = new Shirt(); // 向上轉型
System.out.println(f.toString()); // 多型調用子類實現
Clothing c = new Shirt(); // 介面引用
c.calcArea(); // 介面多型
}
}
| 場景 | 選擇 | 理由 |
|---|---|---|
| 定義「是什麼」核心契約、多重實現 | 介面 | 支援多實現、解耦、JDK 動態代理需介面 |
| 提供共享程式碼、狀態、模板方法 | 抽象類 | 可有建構子、欄位、非抽象方法、單繼承 |
| 既要契約又要共享邏輯 | 抽象類 implements 介面 | 介面對外暴露,抽象類內部複用 |
enum Signal {
RED("停止", 1), GREEN("通行", 2), YELLOW("警示", 3); // 實例必須在第一行
private final String desc;
private final int code;
Signal(String desc, int code) { this.desc = desc; this.code = code; }
public String getDesc() { return desc; }
public int getCode() { return code; }
// 靜態方法查找
public static Signal ofCode(int code) {
for (Signal s : values()) if (s.code == code) return s;
throw new IllegalArgumentException("無效 code: " + code);
}
}
// 使用
Signal s = Signal.RED;
System.out.println(s.getDesc()); // "停止"
for (Signal sig : Signal.values()) System.out.println(sig + "=" + sig.getCode());
// EnumMap/EnumSet 高效集合
EnumMap map = new EnumMap<>(Signal.class);
map.put(Signal.RED, "紅燈");
EnumSet set = EnumSet.of(Signal.RED, Signal.GREEN);
com.公司.專案.模組 (全小寫),對應目錄結構。package com.a.b; 必須在源檔**第一行非註解語句**。import com.a.b.*; 或 import com.a.b.MyClass; (單類別匯入優先,避免命名衝突)。java.lang 自動匯入。# 專案結構
src/
com/
example/
Main.java
util/Helper.java
# 編譯到 out 目錄,保留套件結構
javac -d out src/com/example/Main.java src/com/example/util/Helper.java
# manifest.txt (注意最後一行必須換行) Main-Class: com.example.Main Class-Path: lib/dependency1.jar lib/dependency2.jar # 可選:外部依賴相對路徑
java -jar MyApp.jar