Phân Tích Chi Tiết Lớp Trừu Tượng và Giao Diện Trong Java

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();

Thẻ: java-abstract-class java-interface default-methods interface-inheritance

Đăng vào ngày 19 tháng 6 lúc 08:18