Trong Java, cả interface và abstract class đều được sử dụng để định nghĩa các hành vi trừu tượng, nhưng chúng có những điểm khác nhau về cách sử dụng và vai trò. Hiểu rõ sự khác biệt giữa chúng là rất quan trọng để sử dụng hiệu quả trong lập trình hướng đối tượng.
Đặc điểm | Interface | Abstract Class |
---|---|---|
Kế thừa | Lớp có thể implements nhiều interfaces. | Lớp chỉ có thể extends một abstract class. |
Phương thức | Chỉ có phương thức trừu tượng (cho đến Java 7). Từ Java 8 trở đi, có thể có phương thức mặc định và phương thức tĩnh. | Có thể có cả phương thức trừu tượng lẫn phương thức cụ thể (đã triển khai). |
Constructor | Không thể có constructor. | Có thể có constructor và được gọi khi lớp con được khởi tạo. |
Biến | Chỉ có thể có các biến static và final (hằng số). | Có thể có cả biến instance, biến static, và biến final. |
Đa kế thừa | Hỗ trợ đa kế thừa (một lớp có thể kế thừa nhiều interfaces). | Không hỗ trợ đa kế thừa (chỉ có thể kế thừa một abstract class). |
Mục đích sử dụng | Sử dụng khi muốn định nghĩa hành vi (behaviors) mà các lớp con phải tuân theo. | Sử dụng khi muốn cung cấp một lớp cơ sở với một phần triển khai mặc định và phần còn lại sẽ do các lớp con thực hiện. |
Từ khóa mặc định | Các phương thức trong interface mặc định là public và abstract (nếu không có phần triển khai). | Các phương thức có thể có bất kỳ modifier nào (public, protected, hoặc private). |
Tính linh hoạt | Được sử dụng để định nghĩa API chung mà nhiều lớp có thể thực hiện với các hành vi khác nhau. | Được sử dụng khi có một số hành vi chung nhưng muốn cung cấp triển khai mặc định cho một số phần. |
Tính năng bổ sung | Từ Java 8, có thể thêm các phương thức mặc định (default methods) và phương thức tĩnh. | Có thể chứa constructor, block khởi tạo, phương thức static và non-static methods. |
interface Animal { void sound(); // Phương thức trừu tượng default void sleep() { System.out.println("The animal is sleeping."); } } class Dog implements Animal { public void sound() { System.out.println("Dog barks"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.sound(); // Gọi phương thức của lớp Dog dog.sleep(); // Gọi phương thức mặc định từ interface Animal } }
abstract class Animal { abstract void sound(); // Phương thức trừu tượng void sleep() { System.out.println("The animal is sleeping."); } } class Dog extends Animal { public void sound() { System.out.println("Dog barks"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.sound(); // Gọi phương thức của lớp Dog dog.sleep(); // Gọi phương thức đã được triển khai từ abstract class Animal } }
Interface và Abstract Class đều là các công cụ mạnh mẽ trong Java để xây dựng các hệ thống lập trình hướng đối tượng. Sự khác biệt chính giữa chúng nằm ở cách chúng quản lý đa kế thừa và cách chúng xử lý việc triển khai các phương thức. Interface linh hoạt hơn về mặt đa kế thừa, trong khi abstract class cung cấp khả năng chia sẻ logic giữa các lớp con.
Tùy thuộc vào yêu cầu cụ thể của hệ thống, bạn có thể chọn giữa interface hoặc abstract class để đảm bảo thiết kế phần mềm linh hoạt, dễ bảo trì và mở rộng.