Khi nào dùng abstract và interface trong java

Sự khác nhau giữa Abstract Class và Interface trong Java là gì? Cách sử dụng của hai hình thức này như thế nào? Để giải đáp những thắc mắc này, hãy cùng theo dõi bài viết dưới đây nhé!

Interface và Abstract Class được coi là “cặp sinh đôi” trong Java tuy nhiên vẫn có điểm khác

Phân biệt Abstract Class và Interface trong Java

  • Abstract Class

Các bạn có thể hiểu đây như một người cha, có những đặc tính và hành động chung, bao quát nhất dành cho các lớp con khác.

Một lớp abstract Xe sẽ có thuộc tính là động cơ, cùng với phương thức là khởi động và dừng động cơ. Tuy nhiên Xe là một cái gì đó khá trừu tượng, nó có thể là bất kì loại xe nào và khi đó các lớp con extends lại sẽ định nghĩa riêng cho từng lớp. Và khi đó người con [child class] chỉ có thể có duy nhất 1 lớp cha, có tính chất giống cha [abstract class] đó.

  • Interface

Các bạn có thể hiểu Interface như một bản thiết kế, và bản thiết kế này sẽ liệt kê tất-cả-các-chức-năng cơ bản nhất mà một dự án cần sử dụng. Cơ chế của Interface cũng không khác gì bản hợp đồng, khi thực hiện bản hợp đồng này, ta sẽ phải tuân theo các điều khoản trong đó, không có ngoại lệ.

Mục đích của Interface là thể hiện tính đa hình, khả năng thực hiện các hành động khác nhau. Nếu bạn muốn thể hiện tính đa kế thừa thì dùng Interface. Ví dụ như mình muốn hỗ trợ người dùng thanh toán qua nhiều ngân hàng, mình sẽ tạo môt Interface PayMoney, sau đó nếu muốn bao nhiêu ngân hàng thì chỉ việc thực thi interface này thôi.

Nghe qua sẽ thấy dùng Interface bất tiện, giả sử có 10 class implements 2 Interface nhưng chỉ có 5 class cần thêm một chức năng nữa, liệu có phải viết lặp lại 5 lần trong mỗi class hay lại tạo 1 Interface mới cho riêng 5 class này?

Cách giải quyết này sẽ đúng khi áp dụng với Java 1, 2, 3, 4, 5, 6, 7. Với Java 8, chương trình này đã xuất hiện thêm phương thức default và static sẽ giải quyết vấn đề trên. Còn chưa kể 2 phương thức này còn có body code.

Từ trên, có thể thấy khi implements lại FirstInterface ta không cần implements default method.

Hiểu theo một cách ngắn gọn, khi một class extends một Abstract Class thì mối quan hệ này được gọi là is – a [Ô tô là Xe] , còn khi một class implements một Interface thì mối quan hệ này là can – do [Ô tô có thể chạy].

Kết thúc bài viết, mong rằng các bạn đã có thể hiểu được phần nào về khái niệm và phân biệt được Interface và Abstract Class. Chúc các bạn áp dụng thành công kiến thức này vào những bài tập thực hành của mình sắp tới nhé!

Sự khác nhau giữa Interface và Abstraction Class là gì? Cách phân biệt ra sao? Bài viết này sẽ giải đáp những vấn đề này để bạn có thể lựa chọn cách làm phù hợp nhất cho mỗi trường hợp trong lập trình.

Nếu bạn đã tìm hiểu về lập trình Java, chắc hẳn bạn sẽ biết đến hai khái niệm Interface và Abstraction Class. Nhưng liệu bạn đã biết rõ về công dụng và lợi ích của Abstract và Interface ? Hay sự khác nhau giữa chúng và cách phân biệt ra sao?

1. Khái quát về Interface và Abstraction Class

Interface [hay giao diện] là một kiểu dữ liệu tham chiếu chỉ chứa hằng số và tên các phương thức, không có phần phương thức trừu tượng tương tự với class [lớp]. Tuy nhiên, class thường thể hiện các thuộc tính và hành động của đối tượng, còn Interface thể hiện các hành động của lớp đó. Cũng giống với các lớp, interface không thể được khởi tạo mà chỉ có thể mở rộng hoặc kế thừa từ các Interface khác.

Tính trừu tượng là một tiến trình làm ẩn các trình triển khai và chỉ hiển thị các tính năng quan trọng tới người dùng. Ví dụ: để gửi tin nhắn, người dùng chỉ cần soạn và gửi tin mà không hề biết tiến trình xử lý nội tại triển khai tin nhắn đó như thế nào. Nói cách khác, tính trừu tượng giúp bạn chú ý vào đối tượng thay vì quan tâm đến cách nó thực hiện.

Abstraction Class [AC] được hiểu là một lớp trừu tượng trong Java. AC trong trong Java có thể có các phương thức trừu tượng và không trừu tượng [phương thức với phần thân]. Đặc biệt, nó không thể được khởi tạo mà cần kế thừa và tự triển khai phương thức.

Abstraction Class trong Java

\>>> Xem thêm: 10 Lý do hàng đầu để học JavaScript làm ngôn ngữ lập trình nền tảng

2. Phân biệt Interface và lớp trừu tượng [Abstraction Class]

Cả Interface và Abstraction class đều giống nhau ở điểm có thể chứa phương thức thuần ảo và không thể khởi tạo đối tượng. Tuy nhiên, điểm khác biệt cơ bản của Interface và Abstraction Class như sau:

Abstract class

Interface

Có các phương thức trừu tượng và không trừu tượng

Chỉ có duy nhất phương thức trừu tượng

Không hỗ trợ đa kế thừa

Hỗ trợ đa kế thừa

Có thể tồn tại các biến final và non-final, static và non-static

Chỉ có các biến static và final

Có thể extents [kế thừa] interface

Không thể kế thừa lớp abstract

Sử dụng từ khóa “abstract” để khai báo lớp trừu tượng

Sử dụng từ khóa “interface” để khai báo giao diện

Một lớp trừu tượng có thể extents một lớp Java khác và thực hiện nhiều interface khác nhau

Một interface chỉ có thể implements [cài đặt] nhiều interface khác

Có thể kế thừa bằng cách sử dụng từ khóa “extends”

Các lớp triển khai interface bằng cách sử dụng từ khóa “implements”

Một lớp trừu tượng có phạm vi truy cập ở dạng private, protected,…

Các phương thức, property của interface đều được mặc định ở dạng public

Có thể định nghĩa thân phương thức và property.

Chỉ có thể khai báo, không thể định nghĩa code xử lý.

3. Khi nào bạn nên dùng Interface và Abstraction Class?

Interface giúp bạn cụ thể hóa hành vi của một loại dữ liệu cụ thể, còn Abstraction Class giúp bạn chia sẻ code giữa các lớp có liên quan

Bạn nên sử dụng Interface trong các trường hợp như:

  • Bạn muốn cụ thể hóa hành vi của một loại dữ liệu cụ thể nhưng không bận tâm rằng ai sẽ triển khai hành vi đó.
  • Bạn muốn sử dụng nhiều loại kế thừa.
  • Cần cung cấp các chức năng chung cho các lớp khác nhau. Ví dụ: Interface Comparable và Cloneable.
  • Cần tổng hợp các đối tượng dựa trên các hành vi phổ biến.
  • Bạn muốn sử dụng đa hình vì một lớp có thể thực hiện nhiều interfaces.
  • Cần tạo nên các thành phần [components] được kết nối rời rạc, dễ bảo trì và dùng chúng như 1 plugin vì việc implements cho interface được tách biệt với nó.

Đối với Abstraction Class, bạn có thể cân nhắc sử dụng trong những trường hợp:

  • Bạn cần cung cấp các phương thức mặc định hay các phương thức phổ biến mà nhiều lớp dẫn xuất có thể triển khai.
  • Cần tạo ra nhiều phiên bản với các thành phần [components]. Bạn có thể bổ sung thêm các thuộc tính và phương thức vào Abstraction Class với các lớp kế thừa được cập nhật với tự động.
  • Bạn muốn chia sẻ code giữa các lớp có liên quan.
  • Bạn mong muốn những lớp trừu tượng extend có chung nhiều trường/method hoặc yêu cầu truy cập bộ điều chỉnh thay vì public nó.

Bài viết trên đã giải đáp các vấn đề về Interface và Abstraction Class cũng những điểm khác biệt giữa hai phương thức này. FUNiX hy vọng qua bài viết này, bạn đọc sẽ có một cái nhìn rõ hơn về Interface, Abstract Class. Nếu bạn có bất kỳ đóng góp gì, đừng quên để lại bình luận ở dưới đây.

Khi nào thì sử dụng abstract class và Interface?

Khi nào thì sử dụng interface, khi nào sử dụng abstract class. Khi một nhóm đối tượng có cùng bản chất kế thừa từ một class thì sử dụng abstract class. Khi một nhóm đối tượng không có cùng bản chất nhưng chúng có hành động giống nhau thì sử dụng interface.

Khi nào nên sử dụng Interface trong Java?

Bạn nên sử dụng Interface trong các trường hợp như: Bạn muốn cụ thể hóa hành vi của một loại dữ liệu cụ thể nhưng không bận tâm rằng ai sẽ triển khai hành vi đó. Bạn muốn sử dụng nhiều loại kế thừa. Cần cung cấp các chức năng chung cho các lớp khác nhau.

Tại sao cần dùng interfaces?

Mục đích của interface là để thay thế đa kế thừa lớp của những ngôn ngữ khác [ví dụ như C++, Python…]. Ngoài ra, interface sẽ giúp đồng bộ và thống nhất trong việc phát triển hệ thống trao đổi thông tin.

Trong C# abstract class và Interface có điểm chung là gì?

Giống nhau: Abstract class và interface đều không thể khởi tạo đối tượng bên trong được. Abstract class và interface đều có thể khai báo các phương thức nhưng không thực hiện chúng. Abstract class và interface đều bao gồm các phương thức abstract.

Chủ Đề