| Abstract class | Interface | |
|---|---|---|
| Kế thừa | extends 1 cái | implements nhiều |
| Constructor | ✅ | ❌ |
| State (instance field) | ✅ | ❌ (chỉ hằng số) |
| Default method (concrete) | ✅ | ✅ (Java 8+) |
| Ngữ nghĩa | "is-a" | "can-do" (capability) |
java
abstract class Animal {
protected String name; // có state
Animal(String n) { this.name = n; } // có constructor
abstract void speak();
}
interface Swimmer {
void swim();
default void rest() { /* ... */ } // Java 8+
}
class Duck extends Animal implements Swimmer { /* ... */ }Khi nào chọn cái nào:
- Abstract class: class con cùng một họ + share state hoặc cần kiểm soát constructor.
- Interface: định nghĩa năng lực mà nhiều class không liên quan đều "đeo" được (Comparable, Iterable), hoặc cần đa kế thừa contract.
Quy tắc: mặc định ưu tiên interface; chỉ chọn abstract class khi cần state chung hoặc constructor.
| Abstract class | Interface | |
|---|---|---|
| Inheritance | extends only one | implements many |
| Constructor | ✅ | ❌ |
| State (instance fields) | ✅ | ❌ (constants only) |
| Concrete default methods | ✅ | ✅ (Java 8+) |
| Semantics | "is-a" | "can-do" (capability) |
java
abstract class Animal {
protected String name; // has state
Animal(String n) { this.name = n; } // has a constructor
abstract void speak();
}
interface Swimmer {
void swim();
default void rest() { /* ... */ } // Java 8+
}
class Duck extends Animal implements Swimmer { /* ... */ }When to pick which:
- Abstract class: subclasses form one family + share state or need constructor control.
- Interface: defines capabilities unrelated classes can "wear" (Comparable, Iterable), or for multi-inheritance of contracts.
Rule: default to interface; reach for abstract class only when you need shared state or constructor enforcement.