Abstract class không tạo instance trực tiếp được — chỉ làm template cho subclass.
Subclass phải implement các abstract method.
abstract class HttpClient {
protected final String baseUrl;
protected HttpClient(String baseUrl) { this.baseUrl = baseUrl; }
public abstract <T> T get(String path, Class<T> type); // subclass implement
// Template method pattern — khung cố định, subclass điền chi tiết
public final <T> T fetch(String path, Class<T> type) {
log("call");
T result = get(path, type);
log("done");
return result;
}
}Đặc điểm: có constructor, có state (instance field), trộn abstract + concrete method, dùng đủ access modifier. Chỉ 1 parent.
Khi nào chọn abstract class (thay vì interface):
- Subclass cần share state hoặc code chung — interface không có instance field.
- Cần constructor enforce invariant.
- Template method pattern — như fetch() ở trên.
- Cần protected member — interface ngầm public.
Khi không dùng: subclass không liên quan, cần đa kế thừa contract, hoặc không có state chung → dùng interface.
Java 8+ default method làm mờ ranh giới, nhưng abstract class duy nhất giữ được instance state + constructor logic.
Quy tắc: ưu tiên interface; chỉ chọn abstract class khi thực sự cần state chung hoặc constructor.