Trang chủHướng dẫnAbstract Class và Interface trong Java: Sự khác biệt & Cách dùng chuẩn
Java

Abstract Class và Interface trong Java: Sự khác biệt & Cách dùng chuẩn

CyStack blog 5 phút để đọc
CyStack blog10/06/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 5 minutes

Sự khác biệt  giữa Abstract class và Interface trong Java là một trong những câu hỏi phỏng vấn phổ biến. Việc lựa chọn sử dụng interface hay abstract class là một quyết định thiết kế mà mọi kiến trúc sư phần mềm đều phải đối mặt.

Abstract class và interface trong Java

Trong các bài viết trước, tôi đã cung cấp nhiều thông tin chi tiết về interface và abstract class trong Java. Trong bài viết này, chúng ta sẽ tìm hiểu về sự khác biệt giữa abstract class và interface, cũng như khi nào nên sử dụng interface thay vì abstract class và ngược lại.

Sự khác biệt giữa abstract class và interface

  1. Khi tạo abstract class, chúng ta sử dụng từ khóa abstract, từ khóa này cũng có thể áp dụng cho các phương thức. Ngược lại, để tạo interface, ta dùng từ khóa interface, và từ khóa này không dùng cho các phương thức.
  2. Các class con kế thừa một abstract class bằng từ khóa extends. Chúng buộc phải cung cấp cài đặt cho tất cả các phương thức abstract của class cha, trừ khi bản thân class con đó cũng là abstract class. Trong khi đó, các class con triển khai interface bằng từ khóa implements và phải cài đặt tất cả các phương thức được khai báo trong interface.
  3. Abstract class có thể chứa các phương thức đã có cài đặt, còn interface thì cung cấp sự trừu tượng hóa hoàn toàn, nghĩa là không có cài đặt phương thức nào. Tuy nhiên, cần lưu ý rằng từ Java 8, chúng ta có thể định nghĩa các phương thức defaultstatic trong interface và cung cấp cài đặt cho chúng.
  4. Abstract class có thể có hàm tạo (constructor), trong khi interface thì không.
  5. Abstract class sở hữu đầy đủ các đặc tính của một class Java thông thường, ngoại trừ việc chúng ta không thể tạo object trực tiếp từ nó. Ta dùng từ khóa abstract để khai báo một abstract class. Ngược lại, interface là một kiểu hoàn toàn khác, chỉ có thể chứa các hằng số public static final và các khai báo phương thức.
  6. Các phương thức trong abstract class có thể sử dụng các từ khóa truy cập (access modifier) như public, private, protected, static. Tuy nhiên, các phương thức trong interface ngầm định là publicabstract, và chúng ta không thể áp dụng bất kỳ từ khóa truy cập nào khác cho chúng.
  7. Một class con chỉ có thể kế thừa duy nhất một abstract class nhưng có thể triển khai nhiều interface.
  8. Abstract class có thể kế thừa các class khác và triển khai interface, trong khi interface chỉ có thể kế thừa các interface khác.
  9. Chúng ta có thể chạy một abstract class nếu nó có phương thức main(), nhưng không thể chạy một interface vì interface không thể chứa cài đặt phương thức main.
  10. Interface được dùng để định nghĩa một “hợp đồng” mà các class con phải tuân theo. Abstract class cũng định nghĩa hợp đồng, nhưng nó còn có thể cung cấp các cài đặt phương thức mặc định để các class con sử dụng.

Đó là toàn bộ những điểm khác biệt chính giữa interface và abstract class trong Java. Bây giờ, chúng ta sẽ đi sâu vào việc khi nào nên ưu tiên sử dụng interface thay vì abstract class, và ngược lại.

Interface và abstract class trong Java

Nên lựa chọn interface hay abstract class?

Việc lựa chọn giữa interface và abstract class để định nghĩa “hợp đồng” cho các class con là một quyết định thiết kế quan trọng, phụ thuộc vào nhiều yếu tố. Hãy cùng xem xét khi nào interface là lựa chọn tối ưu và khi nào nên ưu tiên các abstract class.

  1. Java không hỗ trợ đa kế thừa cấp độ class (tức là một class chỉ có thể kế thừa từ một class cha duy nhất), nhưng lại cho phép một class triển khai nhiều interface. Do đó, trong hầu hết các trường hợp, interface là một lựa chọn tuyệt vời để xây dựng nền tảng hệ thống phân cấp class và định nghĩa các hợp đồng. Hơn nữa, việc lập trình dựa trên interface cũng là một trong những phương pháp tốt nhất trong Java.
  2. Nếu hợp đồng của bạn chứa nhiều phương thức, abstract class sẽ hữu ích hơn. Lý do là chúng ta có thể cung cấp cài đặt mặc định cho một số phương thức chung mà tất cả các class con sẽ sử dụng. Ngoài ra, nếu một class con không cần triển khai một phương thức cụ thể, nó có thể bỏ qua việc cung cấp cài đặt. Ngược lại, với interface, class con sẽ buộc phải cung cấp cài đặt cho tất cả các phương thức, ngay cả khi việc triển khai đó chỉ là một khối trống và không mang lại giá trị sử dụng.
  3. Nếu hợp đồng cơ sở (base contract) của chúng ta thường xuyên thay đổi, interface có thể gây ra nhiều vấn đề. Chúng ta không thể thêm các phương thức mới vào interface mà không yêu cầu tất cả các class triển khai phải thay đổi. Trong khi đó, với abstract class, chúng ta có thể cung cấp cài đặt mặc định cho các phương thức mới và chỉ cần cập nhật những class con thực sự sử dụng các phương thức đó.

Kết hợp cả abstract class và interface

Sử dụng kết hợp cả interface và abstract class là cách tiếp cận tối ưu nhất để thiết kế một hệ thống mạnh mẽ. Chẳng hạn, trong JDK, java.util.List là một interface với nhiều phương thức. Để hỗ trợ việc triển khai, có một abstract class là java.util.AbstractList cung cấp cài đặt khung (skeletal implementation) cho hầu hết các phương thức của interface List. Nhờ đó, bất kỳ class con nào cũng có thể kế thừa AbstractList và chỉ cần triển khai các phương thức cần thiết.

Chúng ta nên bắt đầu thiết kế với một interface làm cơ sở, định nghĩa các phương thức mà mọi class con bắt buộc phải triển khai. Sau đó, nếu có những phương thức chỉ dành cho một số class con cụ thể, chúng ta có thể mở rộng interface cơ sở và tạo một interface mới chứa các phương thức đó. Các class con sẽ có sự linh hoạt để lựa chọn triển khai interface cơ sở hoặc interface con tùy theo yêu cầu của mình. Nếu số lượng phương thức tăng lên đáng kể, việc cung cấp một abstract class khung triển khai interface, đồng thời cho phép các class con lựa chọn giữa interface hoặc abstract class, là một ý tưởng rất hay.

Những thay đổi của interface từ Java 8

Từ Java 8 trở đi, các interface đã có thể chứa cài đặt phương thức. Chúng ta có thể tạo các phương thức defaultstatic trong interface và cung cấp cài đặt cho chúng. Điều này giúp thu hẹp đáng kể khoảng cách giữa abstract class và interface. Hiện tại, interface đang trở thành lựa chọn ưu tiên hơn vì ta có thể mở rộng chúng bằng cách cung cấp các cài đặt mặc định cho các phương thức mới mà không làm ảnh hưởng đến các class triển khai hiện có.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.