Sự khác nhau giữa Abstract Class và Interface trong Java?

Cập nhật ngày: 26/04/2024 - Đã có 538 lượt xem bài viết này!
Sự khác nhau giữa Abstract Class và Interface trong Java?
Đây là một câu hỏi khá thú vị với vị trí junior java developer mà bất kì nhà tuyển dụng- NTD nào cũng đưa ra trong buổi phỏng vấn. Bài viết này, tôi sẽ giải thích chi tiết về sự khác nhau giữa hai khái niệm này.

Sự khác nhau giữa Abstract Class và Interface trong Java?

Abstract class và interface là một trong những phần core của ngôn ngữ lập trình Java và việc lựa chọn giữa asbtract class và interface trong thiết kế hệ thống là quyết đinh của một người - một team thiết kế hệ thống.
Và sự khác biệt giữa abstract class và interface được liệt kê như sau:

  1. Abstract class có thể có nhiều method đã được implementation, trong khi interface chỉ define ra những abstract method (không thực hiện implementation). 
  2. Abstract class có thể có những contractor, trong khi interface không có bất kỳ một contractor nào.
  3. Abstract class có tất cả tính năng của một java class bình thường, ngoại trừ việc instantiate nó. Interface chỉ được phép khai báo method và public static final constants.
  4. Method của abstract class có thể sử dụng những access modifiers như private, protected, default, public, static nhưng method của interface chỉ sử dụng public và asbtract. 
  5. Một subclass chỉ có thể extend duy nhất một abstract class nhưng một class có thể implement nhiều interface.
  6. Những abstract class có thể extend abstract class khác và implement nhiều interface, nhưng một interface chỉ có thể extend nhiều interface.
  7. Có thể thực hiện run một abstract class nếu nó có một main() method, ngược với interface thì không. 
  8. Interfaces được sử dụng để define contract cho những class implement, abstract class cũng thực hiện define contract nhưng nó cung cấp một cách thức implementations có săn để subclass sử dụng.

Việc lựa chọn giữa abstract class và interface là một quyết định phụ thuộc vào nhiều yếu tố. Bạn hãy xem khi nào sử dụng asbtract class và khi nào sử dụng interface là giải pháp tốt nhất. Tôi xin đưa ra vài điều dưới đây:

  1. Java không hỗ trợ "multiple class level inheritance", do đó, mọi class chỉ có thể có một super class. Nhưng một class lại có thể implement nhiều interface. Do vậy, trong hầu hết các trường hợp, interface là một sự lựa chọn đúng đắn cho việc cung cấp base contract cho class hierarchy. 
  2. Nếu có nhiều method trong contract, thì bạn nên sử dụng abstract class vì nó cung cấp sẵn implementation cho một vài common method được áp dụng cho tất cả các subclasses. 
  3. Nếu contract của bạn thay đổi liên tục thì sử dụng interface có thể gặp những vấn đề bởi vì nó không thể thêm những method trong interface mà không thay đổi ở phía class thực hiện implement nó. Với abstract thì bạn không cần lo lắng điều này, do đó trong tình huống này thì sử dụng abstract là một giải pháp hiệu quả.

Cách sử dụng hiệu quả nhất?

Trong thực tế, việc sử dụng cả abstract class và interface là một phương pháp tiếp cận hiệu quả cho việc thiết kế hệ thống. Ví dụ như trong JDK, List là một interface có rất nhiều method, nhưng vẫn có song song một abstract class đó là AbstractList, nó cung cấp những skeletal implementation cho tất cả method của List interface, do đó, mọi subclass có thể extend class này và chỉ implement những method cần thiết.

Chúng ta nên luôn luôn bắt đầu bằng một interface như một base và define những method mà mọi subclasses nên thực hiện và sau đó nếu có một số method mà chỉ subclass nhất định phải implement, chúng ta có thể extend base interfacec này với các method mới đó. Các subclasses sẽ có tùy chọn để lựa chọn giữa base interface hoặc child interface để thực hiện những yêu cầu của nó. Nếu số lượng method phát triển nên nhiều, ý tưởng mới là sử dụng một abstract class để cung cấp ra bộ skeletal để imlement các child interface và cung cấp sự linh hoạt cho các subclass lựa chọn giữa abstract class hoặc interface.

Từ JDK 8 trở đi, bạn có thể có nhiều implement method trong nhiều interface. Tức là bạn có thể tạo ra mặc định như những static method trong những interface và cung cấp implementation cho chúng. Điều này sẽ thu hẹp khoảng cách giữa interface và abstract class, và bây giờ, interface là các thực hiện tốt nhất. Để biết thêm chi tiết về điểm thay đổi này trên JDK 8, bạn vui lòng đọc tài liệu JDK 8.

 

Bạn đang muốn tìm kiếm 1 công việc với mức thu nhập cao.
✅ Hoặc là bạn đang muốn chuyển đổi công việc mà chưa biết theo học ngành nghề gì cho tốt.
✅ Giới thiệu với bạn Chương trình đào tạo nhân sự dài hạn trong 12 tháng với những điều đặc biệt mà chỉ có tại IMIC và đây cũng chính là sự lựa chọn phù hợp nhất dành cho bạn:
👉 Thứ nhất: Học viên được đào tạo bài bản kỹ năng, kiến thức chuyên môn lý thuyết, thực hành, thực chiến nhiều dự án và chia sẻ những kinh nghiệm thực tế từ Chuyên gia có nhiều năm kinh nghiệm dự án cũng như tâm huyết truyền nghề.
👉 Thứ hai: Được ký hợp đồng cam kết chất lượng đào tạo cũng như mức lương sau tốt nghiệp và đi làm tại các đối tác tuyển dụng của IMIC. Trả lại học phí nếu không đúng những gì đã ký kết.
👉 Thứ ba: Cam kết hỗ trợ giới thiệu công việc sang đối tác tuyển dụng trong vòng 10 năm liên tục.
👉 Thứ tư: Được hỗ trợ tài chính với mức lãi suất 0 đồng qua ngân hàng VIB Bank.
👉  Có 4 Chương trình đào tạo nhân sự dài hạn dành cho bạn lựa chọn theo học. Gồm có:
1)  Data Scientist full-stack
2)  Embedded System & IoT development full-stack
3)  Game development full-stack
4)  Web development full-stack 
✅ Cảm ơn bạn đã dành thời gian lắng nghe những chia sẻ của mình. Và tuyệt vời hơn nữa nếu IMIC được góp phần vào sự thành công của bạn. 
✅ Hãy liên hệ ngay với Phòng tư vấn tuyển sinh để được hỗ trợ về thủ tục nhập học.
✅ Chúc bạn luôn có nhiều sức khỏe và thành công!

 

Tham khảo các khóa đào tạo nhân sự qua danh mục