Interface trong JAVA | JAVA DEV

Một Interface trong Java là một bản kế hoạch của class. Nó có chứa static constant và abstract method (phương thức trừu tượng)

Interface trong JAVA

Interface trong Java là một cơ chế để đạt được sự trừu tượng. Có thể chỉ có các phương thức trừu tượng trong Interface, không có phần thân phương thức. Nó được sử dụng để đạt được tính trừu tượng và đa kế thừa trong Java.

Nói cách khác, interface có thể có các phương thức trừu tượng và biến. Không có thân phương thức.

  • Interface cũng đại diện cho mối quan hệ IS-A
  • Interface không thể khởi tạo như classs
  • Từ phiên bản JAVA 8, chúng ta có thể có phương thức default và static trong interface
  • Từ JAVA 9 thì có thể có phương thức private trong interface

Tại sao nên sử dụng interface trong JAVA?

Chủ yếu có ba lý do để sử dụng giao diện. Chúng được đưa ra dưới đây.

  • Sử dụng Interface để đạt được sự trừu tượng.
  • Interface có thể hỗ trợ chúng ta đạt được đa kế thừa (Vì Java mặc định không hỗ trợ đa kế thừa thông qua class).
  • Nó có thể được sử dụng để đạt được Loose coupling.

Ghi chú: Loose coupling là có nghĩa là giữa các class gần như độc lập. Nếu class A biết về class B qua những gì đã thể hiện trong class B thì class A và class B là Loose coupling

Cách khai báo Interface trong JAVA

Một Interface trong Java được khai báo bằng cách sử dụng từ khóa interface. Nó cung cấp tổng thể trừu tượng; có nghĩa là tất cả các phương thức trong một interface được khai báo mà không có phần thân và tất cả các trường (field) là công khai (public), tĩnh (static) và cuối (final) cùng theo mặc định.

Một class triển khai một interface phải thực hiện tất cả các phương thức được khai báo trong interface.

Cú pháp của interface trong Java:

interface <interface_name>{  
    // Khai báo constant fields  
    // Khai báo phương thức trừu tượng 
    // ... 
}  

Tham khảo: Cách đặt tên trong Java để biết cách đặt tên Interface tiêu chuẩn.

Cải tiến Interface trong JAVA 8

Kể từ Java 8, Interface có thể có các phương thức default và static sẽ được thảo luận sau.

Ghi chú: Trình biên dịch Java tự động thêm các từ khóa publicabstract trước phương thức trong Interface. Và nó cũng thêm các từ khóa public, staticfinal trước các data member. Do đó khi khai báo Interface chúng ta không cần thêm chúng.

Ví dụ chúng ta khai báo một interface thế này:

interface IInAn {
    int MIN = 5;
    void in();
}

Thì trình biên dịch sẽ hiểu / dịch như thế này:

interface IInAn {
    public static final int MIN = 5;
    public abstract void in();
}

Mối quan hệ giữa class và interface

Như trong hình bên dưới, một class mở rộng (extend) một class khác, một interface mở rộng (extend) một interface khác, nhưng một class sẽ triển khai (implements) một interface.

Mối quan hệ giữa class và interface trong Java

Lưu ý: Nếu bạn đang tích cực học Java để đi thực tập, đi làm. Hãy tham khảo ngay khóa học LẬP TRÌNH JAVA WEB tại NIIT – ICT Hà Nội để được hướng dẫn bởi chuyên gia doanh nghiệp, đào tạo theo nhu cầu thực tiễn, tuyển dụng ngay cuối khóa học!

Ví dụ về Interface trong JAVA

Trong ví dụ này, Interface IInAn chỉ có một phương thức và việc triển khai nó được cung cấp trong class A6.

// Khai báo Interface
interface IInAn{
    // Khai báo phương thức trừu tượng  
    void inThongTin(); 
}

// Triển khai interface
class A6 implements IInAn{
    // Viết khai triển cụ thể cho phương thức trừu tượng
    public void inThongTin(){
        System.out.println("Xin Chào");
    }
  
    public static void main(String args[]){  
        A6 a6 = new A6();
        a6.inThongTin();
    }
}

Kết quả khi chạy chương trình:

Xin chào

Tiếp tục một ví dụ khác về interface trong Java.

Trong ví dụ này, Interface IVeHinh chỉ có một phương thức ve(). Việc triển khai nó được cung cấp bởi các lớp HinhChuNhat và HinhTron.

Trong một kịch bản thực tế, một interface sẽ được định nghĩa bởi người khác, việc triển khai nó sẽ khác nhau bởi các lập trình viên khác nhau. Phần triển khai được ẩn bởi người dùng sử dụng interface.

// Khai báo Interface: User đầu tiên
interface IVeHinh{  
    void ve();  
}

// Triển khai: User thứ hai 
class HinhChuNhat implements IVeHinh{  
    public void ve(){
        System.out.println("Vẽ hình chữ nhật...");
    }  
}

class HinhTron implements IVeHinh{  
    public void ve(){
        System.out.println("Vẽ hình tròn...");
    }  
}

// Sử dụng interface: User thứ ba  
class TestInterface1{ 
    public static void main(String args[]){
        IVeHInh d = new HinhTron();
        d.ve();
    }
}  

Kết quả khi chạy chương trình:

Vẽ hình tròn...

Hãy thử xem một ví dụ khác về interface java cung cấp việc triển interface INganHang

interface INganHang{  
    float rateOfInterest();  
}
 
class Agri implements INganHang{  
    public float laiSuat(){
        return 0.07;
    }  
}

class VCB implements INganHang{  
    public float laiSuat(){
        return 0.08;
    }
}

class TestInterface2{  
    public static void main(String[] args){  
        INganHang nganHang = new VCB();  
        System.out.println("Lãi suất: " + nganHang.laiSuat() * 100 + "%");  
    }
}

Kết quả khi chạy chương trình:

Lãi suất: 8%

Đạt được tính đa kế thừa trong Java thông qua interface

Nếu một lớp Java triển khai nhiều interface hoặc interface mở rộng nhiều interface, nó được gọi là đa kế thừa.

Đạt được đa kế thừa trong Java thông qua Interface

Ví dụ:

interface IInAn{  
    void inThongTin();  
}

interface IHienThi{  
    void hienThi();  
}

// Đa kế thừa
class A7 implements IInAn, IHienThi{  
    public void inThongTin(){
        System.out.println("Xin chào");
    }  
    public void hienThi(){
        System.out.println("Hiển thị bản xem trước");
    }

    public static void main(String args[]){
        A7 a7 = new A7();
        a7.inThongTin();
        a7.hienThi();
    }
}

Kết quả khi chạy chương trình:

Xin chào
Hiển thị bản xem trước

Câu hỏi: Đa kế thừa không được hỗ trợ thông qua class trong java, nhưng tại sao nó có thể được thực hiện bởi một interface?

Như chúng ta đã giải thích trong chương kế thừa trong Java, Java không hỗ trợ đa kế thừa class vì sự mơ hồ.

Tuy nhiên, vì đa kế thừa thông qua interface không mơ hồ nên nó được hỗ trợ. Việc triển khai của nó được cung cấp bởi class thực thi. Ví dụ:

interface IInAn{  
    void inThongTin();  
}  
interface IHienThi{  
    void hienThi();  
}  

class TestInterface3 implements IInAn, IHienThi{  
    public void inThongTin(){
        System.out.println("Xin chào");
    }
    public static void main(String args[]){  
        TestInterface3 obj = new TestInterface3();  
        obj.inThongTin();  
    }
}

Kết quả khi chạy chương trình:

Xin chào

Kế thừa interface

Trong Java, một class triển khai (implements) một interface, nhưng một interface này mở rộng (extends) một interface khác.

interface IInAn{  
    void inThongTin();  
}
 
interface IHienThi extends IInAn{  
    void hienThi();
}

class TestInterface4 implements Showable{  
    public void inThongTin(){
        System.out.println("Xin chào");
    }  
    public void hienThi(){
        System.out.println("Hiển thị bản xem trước");
    }  
  
    public static void main(String args[]){  
        TestInterface4 obj = new TestInterface4();  
        obj.inThongTin();  
        obj.hienThi();  
 }
}

Kết quả khi chạy chương trình:

Xin chào
Hiển thị bản xem trước

Phương thức default của Java 8 trong interface

Kể từ Java 8, chúng ta có thể có thân phương thức trong interface. Nhưng chúng ta cần đặt nó thành phương thức default. Hãy xem một ví dụ:

interface IVeHinh{  
    void ve();  
    default void msg(){
        System.out.println("Phương thức default");
    }  
}

class HinhChuNhat implements IVeHinh{  
    public void ve(){
        System.out.println("Vẽ hình chữ nhật");
    }
}

class TestInterfaceDefault{
    public static void main(String args[]){  
        IVeHinh hinhChuNhat = new HinhChuNhat();  
        hinhChuNhat.ve();  
        hinhChuNhat.msg();  
    }
}

Kết quả khi chạy chương trình:

Vẽ hình chữ nhật
Phương thức default

Câu hỏi: Interface được đánh dấu (marker) hoặc được gắn thẻ (tagged) là gì?

Một interface không có data member nào được gọi là marker interface hoặc tagged interface.

Ví dụ: Serializable, Cloneable, Remote , v.v. Chúng được sử dụng để cung cấp một số thông tin cần thiết cho JVM để JVM có thể thực hiện một số hành vi.

Interface lồng nhau trong Java

Một interface có thể có một interface khác được gọi là interface lồng nhau (Nested Interface). Chúng ta sẽ tìm hiểu nó một cách chi tiết trong chương Nested Class. Ví dụ:

interface IInAn{  
    void in();
    
    // Interface được lồng trong interface khác
    interface IThongTinInAn{  
        void thongTin();  
    }
}

Như vậy, qua bài viết này, mình đã hướng dẫn bạn tìm hiểu về interface trong Java, và cùng với các ví dụ đơn giản hi vọng bạn hiểu được cách khai báo, triển khai và đạt được tính đa kế thừa thông qua interface.

Chúc bạn học tốt!