Lớp trừu tượng và giao diện là hai cơ chế nền tảng trong Java để triển khai tính trừu tượng hóa và đa hình. Dưới đây là các quy tắc và điểm khác biệt cốt lõi.
Quy tắc lớp trừu tượng
- Phương thức trừu tượng không chứa thân phương thức, chỉ khai báo và được triển khai bởi lớp con
- Lớp trừu tượng không thể khởi tạo trực tiếp
- Phương thức trừu tượng không được khai báo
private(không thể kế thừa) - Lớp trừu tượng có thể chứa phương thức không trừu tượng và trường (có thể ghi đè hoặc gọi từ lớp con)
Quy tắc giao diện
- Giao diện tập trung vào phương thức trừu tượng, có thể bao gồm phương thức mặc định (
default), tĩnh (static) và riêng tư (private) - Trường trong giao diện chỉ được khai báo
public static final - Lớp thực hiện giao diện bằng từ khóa
implements - Phương thức trong giao diện luôn
public - Java không hỗ trợ đa kế thừa, nhưng cho phép triển khai nhiều giao diện
- Giao diện có thể kế thừa từ giao diện khác bằng
extends
So sánh lớp trừu tượng và giao diện
| Yếu tố | Lớp trừu tượng | Giao diện |
|---|---|---|
| Khai báo | abstract |
interface |
| Triển khai | Lớp con dùng extends |
Lớp con dùng implements |
| Phương thức tĩnh | Cho phép | Không cho phép |
| Đa kế thừa | Tối đa 1 lớp | Nhiều giao diện |
| Mục đích | Định nghĩa "thế nào" và "hành vi cơ bản" | Định nghĩa "hành vi cụ thể" |
Phương thức trong giao diện
Phương thức trừu tượng
Phương thức cốt lõi, phải triển khai bởi lớp thực hiện.
interface Wildlife {
void produceSound();
}
Phương thức mặc định
Giúp cung cấp triển khai mặc định (Java 8+).
interface Wildlife {
void produceSound();
default void rest() {
System.out.println("Resting quietly...");
}
}
Phương thức tĩnh
Thuộc về giao diện, gọi trực tiếp qua tên giao diện (Java 8+).
interface Wildlife {
static void showInfo() {
System.out.println("Wildlife interface");
}
}
Phương thức riêng tư
Dùng cho hỗ trợ nội bộ (Java 9+).
interface Wildlife {
void produceSound();
default void handleSound() {
System.out.println("Processing sound");
internalLog();
}
private void internalLog() {
System.out.println("Sound logged");
}
}
Triển khai giao diện và lớp trừu tượng
Thực hiện giao diện
// Giao diện
interface Wildlife {
void produceSound();
}
// Lớp thực hiện
class Bird implements Wildlife {
public void produceSound() {
System.out.println("The bird chirps: Tweet! Tweet!");
}
}
// Sử dụng
Wildlife bird = new Bird();
bird.produceSound();
Triển khai lớp trừu tượng
// Lớp trừu tượng
abstract class Wildlife {
public abstract void produceSound();
public void move() {
System.out.println("Moving gracefully");
}
}
// Lớp con
class Bird extends Wildlife {
public void produceSound() {
System.out.println("The bird chirps: Tweet! Tweet!");
}
}
// Sử dụng
Wildlife bird = new Bird();
bird.produceSound();
bird.move();