- Sản phẩm & Dịch vụSản phẩm & Dịch vụ
- Giải phápGiải pháp
- Bảng giáBảng giá
- Công tyCông ty
- Tài liệuTài liệu
vi
vi
Chuyên mục với 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.
Web Developer
I’m passionate about web development and sharing my insights through articles, with over 8 years of experience. I hope these sharings inspire you and help build a strong web development community. @#@ Tôi đam mê phát triển web và chia sẻ những hiểu biết của mình thông qua các bài viết, với hơn 8 năm kinh nghiệm. Tôi hy vọng những chia sẻ này sẽ truyền cảm hứng cho các bạn và giúp xây dựng một cộng đồng phát triển web mạnh mẽ.
Thảo luận (0)
Đăng nhập để thảo luận
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.

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.
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.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.default và static trong interface và cung cấp cài đặt cho chúng.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.public, private, protected, static. Tuy nhiên, các phương thức trong interface ngầm định là public và abstract, 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.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.Đó 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.

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.
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.
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 default và static 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ó.