Interface là một khái niệm không dễ hiểu chút nào khi học Java. Khi tìm hiểu bạn sẽ thấy rằng nó có một số điểm tương tự như Abstract Class (Lớp trừu tượng). Vậy thì Interface trong Java là gì và sự khác biệt với Abstract Class như thế nào. Hãy đọc bài viết này để hiểu rõ hơn.
Định nghĩa Interface Java là gì?
Java không cho phép sử dụng đa kế thừa cho một Class. Có nghĩa là, một lớp không thể kế thừa nhiều hơn một lớp cùng một lúc. Nhưng với Interface thì có thể làm được điều đó.
Giả sử chúng ta có hai lớp là ConCho và ConGa. Đây là hai đối tượng riêng biệt. Tiếp theo đó tạo ra một Class là DongVat. Vậy làm thế nào để kế thừa được ConCho và ConGa cùng một lúc.
Dùng extends để kể thừa 2 lớp cùng một lúc là điều không thể.
// Cách viết sai class DongVat extends ConCho, ConGa { void myName() { System.out.println("Tôi là động vật."); } }
Nhưng với Interface hoàn toàn có thể kế thừa được nhiều lớp.
public class DongVat implements ConCho, ConGa { void so_chan() { System.out.println("Test"); } }
Cú pháp:
class className implements InterfaceName { // Code }
Đặc điểm cần nhớ của Interface:
- Interface là giao diện khuôn mẫu để triển khai lớp
- Nó là tập hợp của các phương thức trừu tượng.
- Interface không thể khởi tạo
- Sử dụng từ khóa implements để kế thừa
- Biến sử dụng phải là public, static và final
- Các biến phải được khởi tạo tại thời điểm khai báo
- Các biến không bao giờ có thể được khai báo là riêng tư (private). (Đọc lại Private Public Protected trong Java)
- Các phương thức của Interface luôn là công khai và trừu tượng
- Giao diện có thể kế thừa các giao diện khác nhưng lớp triển khai giao diện đó phải thực thi các phương thức của tất cả các giao diện kế thừa.
- Một lớp có thể kế thừa nhiều hơn một giao diện cùng một lúc và nó phải triển khai tất cả các phương thức của tất cả các giao diện được kế thừa.
Implements nhiều Interface
class className implements InterfaceName1, InterfaceName2, ...{ // Code }
Ví dụ thực tế về Interface trong Java
Bây giờ chúng ta sẽ làm bài tập ví dụ ở trên để hiểu về cách sử dụng Interface trong Java.
ConCho.java
public interface ConCho { void so_chan(); }
DongVat.java
class DongVat implements ConCho { public void so_chan() { System.out.println("Số chân: "); } public static void main(String[] args) { DongVat obj = new DongVat(); obj.so_chan(); } }
Tiếp theo đó mình sẽ tạo ra một tập tin là ConGa.java
public interface ConGa { public void mau_long(); }
Và thêm một phương thức mau_long()
trong file DongVat.java ngay bên dưới phương thức so_chan()
public void mau_long() { System.out.println("Màu lông: "); }
Nhiều đối tượng cũng có thể kế thừa từ một Interface
class ConNguoi implements ChuyenDong { void chay_bo() { System.out.println("Hành động chạy"); } } class ConCho implements ChuyenDong { void chay_bo() { System.out.println("Hành động chạy"); } }
So sánh Abstract và Interface trong Java
Chắc bạn sẽ thắc mắc rằng khi nào dùng Abstract và Interface? Đây là thắc mắc chắc hẳn ai khi tìm hiểu về Interface cũng giống như bạn. Hãy xem 2 cái này có sự khác nhau như thế nào:
- Một giao diện (Interface) chỉ có phương thức trừu tượng. Còn Abstract Class có cả phương thức trừu tượng và thường.
- Phương thức trong Interface chỉ có thể là public. Còn với Abstract Class có thể là public, private hoặc protected.
- Các biến trong Interface chỉ sử dụng public và final.
- Biến của một giao diện phải được khởi tạo trong quá trình khai báo. Mặt khác, các biến trong một lớp trừu tượng có thể được khởi tạo bất kỳ lúc nào.
Kết thúc bài học này bạn đã hiểu được về Interface trong Java như thế nào chưa? Trên đây mình đã giải thích rõ khái niệm cũng như lấy ví dụ để bạn có thể dễ dàng hiểu và phân biệt được. Đây là bài học về lập trình hướng đối tượng (OOP) khá quan trọng vì thế bạn cần lưu ý.