Interface định nghĩa contract — danh sách method mà implementation phải cung cấp. Tách "làm được gì" khỏi "làm thế nào". Một class implements nhiều interface.
Lịch sử tiến hoá:
| Phiên bản | Thêm gì |
|---|---|
| Java ≤ 7 | Chỉ public abstract method + public static final constant |
| Java 8 | default method (có implementation), static method |
| Java 9 | private method (helper cho default) |
public interface PaymentGateway {
String VERSION = "v2"; // implicit public static final
void charge(BigDecimal amount, String currency); // abstract
default void chargeUSD(BigDecimal amount) { // default — Java 8+
charge(amount, "USD");
}
static PaymentGateway noOp() { return (a, c) -> {}; } // static — Java 8+
}Vì sao Java 8 thêm default? Để evolve interface mà không break implementation cũ — vd stream() được thêm vào Collection qua default method, không thì mọi Collection từ thư viện ngoài đều fail compile.
Quy tắc:
- Field ngầm public static final; method ngầm public abstract.
- Interface không có constructor, không có state (chỉ hằng số).
- Implement nhiều interface có default trùng → phải override tường minh.
Khi dùng interface (vs abstract class):
- Capability/contract cho nhiều class không liên quan (Comparable, Iterable).
- Public API thư viện, DI/strategy pattern.
- Cần đa kế thừa contract.
Functional interface (đúng 1 abstract method) implement được bằng lambda — nền tảng của Stream/Optional API.
Java 17+ sealed interface: giới hạn class nào được implement, kết hợp pattern matching cho exhaustive switch.