×

Interface và Abstract Class trong Java khác nhau như thế nào?

Trong Java, cả interface và abstract class đều là cơ chế để đạt được tính trừu tượng. Tuy nhiên, chúng có những đặc điểm và sử dụng riêng biệt phù hợp với các tình huống khác nhau. Dưới đây là sự khác biệt chính giữa interface và abstract class:

Interface

  1. Định nghĩa: Interface định nghĩa một "hợp đồng" hoặc một tập hợp các phương thức abstract mà lớp thực thi interface phải triển khai. Interface không chứa bất kỳ phương thức thực thi (non-abstract) nào (trừ khi đó là static hoặc default methods được giới thiệu trong Java 8).
  2. Thuộc tính: Interface không thể chứa các thuộc tính trạng thái (instance variables). Tất cả các biến trong interface đều là public static final (hằng số).
  3. Triển khai: Một lớp có thể triển khai (implements) nhiều interface.
  4. Mục đích: Sử dụng khi các lớp không liên quan đến nhau muốn triển khai một giao diện chung.

Abstract Class

  1. Định nghĩa: Abstract class là một lớp không thể tạo instance. Nó thường được sử dụng làm lớp cơ sở cho các lớp khác để kế thừa. Abstract class có thể chứa cả phương thức abstract (không có thân) và phương thức không abstract (có thân).
  2. Thuộc tính: Abstract class có thể chứa các thuộc tính trạng thái (instance variables).
  3. Kế thừa: Một lớp chỉ có thể kế thừa (extends) từ một abstract class.
  4. Mục đích: Sử dụng khi các lớp kế thừa có mối quan hệ chặt chẽ và muốn chia sẻ mã code hoặc thuộc tính trạng thái.

Sự Khác Biệt Chính

  • Mối quan hệ: Abstract class thể hiện mối quan hệ "is-a" (là một), thích hợp cho các lớp có mối quan hệ kế thừa tự nhiên. Interface thể hiện mối quan hệ "can-do" (có thể làm) hoặc "has-a" (có một), phù hợp khi muốn triển khai các chức năng mà không cần quan tâm đến kế thừa.
  • Triển khai đa kế thừa: Java không hỗ trợ đa kế thừa trực tiếp thông qua các lớp, nhưng cho phép đa kế thừa tính năng thông qua việc triển khai nhiều interface.
  • Chức năng: Abstract class cho phép chia sẻ mã (phương thức không abstract), trong khi interface chủ yếu được sử dụng để định nghĩa loại hành vi mà một lớp phải thực hiện.

Chọn giữa interface và abstract class phụ thuộc vào yêu cầu thiết kế của ứng dụng và cách bạn muốn tổ chức code của mình.

Comments