Bỏ qua để đến nội dung

Interface và Abstract class

Một abstract class là một lớp không thể tạo đối tượng trực tiếp (new), dùng làm lớp cha chung, có thể chứa cả phương thức đã cài đặt sẵn phương thức trừu tượng (chưa cài đặt, bắt buộc lớp con phải override):

public abstract class Shape {
abstract double getArea(); // phương thức trừu tượng - KHÔNG có thân, lớp con BẮT BUỘC override
void printInfo() { // phương thức đã cài đặt sẵn - lớp con dùng luôn, không bắt buộc override
System.out.println("Diện tích: " + getArea());
}
}
public class Circle extends Shape {
double radius;
Circle(double radius) { this.radius = radius; }
@Override
double getArea() { // BẮT BUỘC cài đặt vì Shape khai báo trừu tượng
return Math.PI * radius * radius;
}
}
// Shape shape = new Shape(); // LỖI BIÊN DỊCH! Không thể tạo đối tượng từ abstract class
Shape circle = new Circle(5); // OK - Circle đã cài đặt đầy đủ
circle.printInfo(); // Diện tích: 78.53981633974483

Một interface định nghĩa một “hợp đồng” (contract) - tập hợp các phương thức mà mọi lớp implement nó phải cài đặt, mặc định không chứa cài đặt (từ Java 8, interface cũng có thể chứa default/static method có sẵn):

public interface Flyable {
void fly(); // mặc định là abstract, không cần ghi "abstract"
default void land() { // default method (Java 8+) - có sẵn cài đặt, lớp implement không bắt buộc override
System.out.println("Đang hạ cánh...");
}
}
public class Bird implements Flyable { // dùng "implements", không phải "extends"
@Override
public void fly() {
System.out.println("Chim đang bay");
}
}

3. Một class implement được nhiều interface

Phần tiêu đề “3. Một class implement được nhiều interface”

Khác với kế thừa class (chỉ extends được một class), một class có thể implements nhiều interface cùng lúc - đây là cách Java mô phỏng “đa kế thừa hành vi”:

public interface Swimmable {
void swim();
}
public class Duck implements Flyable, Swimmable { // implement CẢ HAI interface
@Override
public void fly() { System.out.println("Vịt đang bay"); }
@Override
public void swim() { System.out.println("Vịt đang bơi"); }
}
Abstract class Interface
Từ khóa kế thừa extends implements
Số lượng kế thừa Chỉ một Nhiều
Field Có thể có field thường Mặc định public static final (hằng số)
Phương thức có cài đặt Có (default/static, Java 8+)
Constructor Không có
Dùng khi Các lớp con có quan hệ “là một” (is-a) chặt chẽ, chia sẻ nhiều code chung Định nghĩa “khả năng làm được gì” (can-do), không quan tâm quan hệ kế thừa

Giống như với class, một biến khai báo kiểu interface có thể trỏ đến đối tượng của bất kỳ lớp nào implement nó:

Flyable flyable = new Bird();
flyable.fly(); // Chim đang bay
flyable = new Duck();
flyable.fly(); // Vịt đang bay
  • Abstract class: không tạo được đối tượng trực tiếp, có thể trộn phương thức trừu tượng và đã cài đặt sẵn, chỉ kế thừa được một
  • Interface: định nghĩa hợp đồng hành vi, một class implement được nhiều interface cùng lúc
  • default method (Java 8+) cho phép interface có sẵn cài đặt mà lớp implement không bắt buộc override
  • Dùng abstract class khi các lớp con có quan hệ họ hàng chặt chẽ; dùng interface khi chỉ cần mô tả “khả năng”