Interface trong java với ví dụ cụ thể

Ở bài trước chúng ta đã tìm hiểu về abstract class được sử dụng để triển khai tính trừu tượng trong java.

Không giống như abstract class, interface được sử dụng để biểu diễn 100% tính trừu tượng. Trong một interface các method sẽ mặc định là abstract method. Nói đến interface chúng ta sẽ nhìn nhận nó như là một khuôn mẫu các hành động được cung cấp mà bạn không thể biết bên trong nó thực hiện như thế nào.

Cách sử dụng interface trong java

Như phần ở trên, interface được sử dụng để biểu diễn 100% tính trừu tượng. 

Các method trong interface mặc định đều là asbtract method. 

Trước mỗi method trong interface đều mặc định được thêm vào trước cặp từ khoá public static.

Các class implement interface phải implement tất cả các method được khai báo trong interface.

Các class trong java không được extends nhiều class, nhưng với có thể implement nhiều interface khác nhau.

Cú pháp khai báo interface

interface MyInterface
{
   /* Tất các các method đều mặc định thêm public abstract method.
    * Các method không có thân hàm
    */
   public void method1();
   public void method2();
}

Ví dụ: Chúng ta có interface Mail chứa các method sendMail(), log(). Class MailImpl sẽ implement Mail và triển khai các method mà Mail khai báo.

// File Mail.java
public interface Mail {
    void sendMail();
    void log();
}
// File MailImpl.java
public class MailImpl implements Mail {
    @Override
    public void sendMail() {
        System.out.println("Sending email");
    }

    @Override
    public void log() {
        System.out.println("Log!!!");
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        Mail mail = new MailImpl();

        mail.sendMail();
        mail.log();
    }
}

Output:

Sending email
Log!!!

Đa thừa kế trong interface 

Trong java, các class thông thường thì chỉ được phép extends từ một class cha duy nhất có thể là một class khác hoặc abstract class. Thế nhưng trong interface chúng ta có thể extends nhiều interface khác.

Ví dụ chúng ta có 3 interface A, B, C. C sẽ extends từ A, B. InterfaceImpl sẽ implement C. đồng nghĩa với việc nó sẽ implement các method được định nghĩa trong cả 3 interface A, B, C.

// File A.java
public interface A {
    void a();
}
// File B.java
public interface B {
    void b();
}
// File C.java
public interface C extends A, B {
    void c();
}
public class InterfaceImpl implements C {
    @Override
    public void c() {
        System.out.println("C");
    }

    @Override
    public void a() {
        System.out.println("A");
    }

    @Override
    public void b() {
        System.out.println("C");
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        C c = new InterfaceImpl();
        c.a();
        c.b();
        c.c();
    }
}

Output: 

A
B
C

Đặt câu hỏi nếu có abstract method được định nghĩa ở cả interface cha và con. Nếu một class implement interface con thì sẽ triển khai hàm nào? Câu trả lời là hàm nào cũng được ha.

Ví dụ

// File A.java
public interface A {
    void demo();
}
public interface C extends A{
    void demo();
}
// File InterfaceImpl.java
public class InterfaceImpl implements C {
    @Override
    public void demo() {
        System.out.println("Demo");
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        C c = new InterfaceImpl();
        c.demo();
    }
}

Outout: Demo

Tag và Marker interface trong java

Một interface không chứa bất kỳ một method hay thuộc tính nào gọi là Tag hoặc Marker interface. Ví dụ Serializable, EventListener etc.

Functional Interface

Functional Interface là một interface chứa duy nhất một abstract method. Từ java 8 trở đi lambda expressions được sử dụng nhiều với functional interface để thể hiện một implement của nó.

Một functional interface có thể có nhiều default method, static method, nên các bạn đừng nhầm tưởng rằng functional interface lại có nhiều method thế kia nhé, nó chỉ có một abstract method duy nhất thôi!

Các tính năng mới trong JDK 8

Ở các phiên bản JDK 8 trở về trước, chúng ta sẽ không thể triển khai một mã code xử lý cho một hàm bên trong interface. Trong Java 8, chúng ta có ta có thể sử dụng default method trong interface cho phép triển khai mã code bên trong hàm.

interface In1 
{ 
    final int a = 10; 
    default void display() 
    { 
        System.out.println("hello"); 
    } 
} 
  
class TestClass implements In1 
{ 

    public static void main (String[] args) 
    { 
        TestClass t = new TestClass(); 
        t.display(); 
    } 
} 

Output: hello

Mục đích của default method sinh ra cho phép mã code Java mới tương thích với mã code ngủ. Ví dụ như mình có 1 interface được implement từ 5 class khác nhau, khi muốn thêm một chức năng mới vào interface, nếu mình thêm một method và interface thì biên dịch sẽ bị lỗi vì 5 class kia phải triển khai method này trong khi chúng không cần sử dụng. Do vậy mình sẽ định nghĩa một default method với mã code được triển khai bên trong, 5 class kia sẽ không cần phải triển khai, và mình có thể sử dụng tính năng mới này trong mã mới.

Thêm một tính năng mới nữa là chúng ta có thể sử dụng static method trong interface và có thể gọi trực tiếp mà không cần khởi tạo một object.

interface In1 
{ 
    final int a = 10; 
    static void display() 
    { 
        System.out.println("hello"); 
    } 
} 
  
class TestClass implements In1 
{ 
    // Driver Code 
    public static void main (String[] args) 
    { 
        In1.display(); 
    } 
} 

Output: hello

Một số tính năng mới trong JDK 9

Từ Java 9 trở đi, các giao diện cũng có thể chứa:

  1. Static methods
  2. Private methods
  3. Private Static methods

Note:

  • Một interface không thể khởi tạo. Nghĩa là bạn không thể khởi tạo một object của interface.
  • Interface cung cấp 100% tính trừu tượng với các method mặc định là abstract method.
  • Class sử dụng từ khoá implement để implement một interface.
  • Các class implement một interface bắt buộc phải triển khai tất cả các method được khai báo trong interface. 
  • Interface không để khai báo với từ khoá private hoặc protected 
private interface A;
// Hoặc
protected interface A

Các khởi tạo trên là không được phép.

Trong interface các biến mặc định là public, static và final 

interface A
{
   int a=10;
   public int a=10;
   public static final int a=10;
   final int a=10;
   static int a=0;
}

Các cách khai báo trên là giống như và nó sẽ đều là 

public static final int a=10;

Nguồn tham khảo 

https://www.geeksforgeeks.org/interfaces-in-java/

Interface in java with example programs

Các bài viết liên quan

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x