Interface trong java

Trong ngôn ngữ lập trình Java, một interface là một bản thiết kế của một lớp. Nó chỉ chứa các phương thức trừu tượng và biểu diễn mối quan hệ “IS-A”. Interface trong Java cho phép chúng ta đạt được tính trừu tượng hoàn toàn và đa kế thừa. Trong bài viết này, chúng ta sẽ khám phá chi tiết về interface và những đặc điểm quan trọng của nó.

Interface trong Java

Một interface trong Java là một tập hợp các phương thức trừu tượng. Một lớp có thể triển khai (implement) một interface và kế thừa các phương thức abstract của interface đó. Interface không phải là một lớp, mà là một cách khai báo các hành vi mà một lớp triển khai.

Các trường của interface mặc định là public, static và final, trong khi các phương thức là public và abstract. Một interface không thể được khởi tạo giống như một lớp trừu tượng.

Ví dụ đơn giản về Interface trong Java

Hãy xem một ví dụ đơn giản về cách sử dụng interface trong Java:

public interface Printable {
    void print();
}

public class A implements Printable {
    public void print() {
        System.out.println("Hello, I am printable");
    }

    public static void main(String[] args) {
        A obj = new A();
        obj.print();
    }
}

Trong ví dụ trên, chúng ta có interface Printable với một phương thức print(). Lớp A triển khai (implements) interface Printable và triển khai phương thức print(). Khi chúng ta khởi tạo một đối tượng của lớp A và gọi phương thức print(), kết quả sẽ là “Hello, I am printable”.

Đa kế thừa trong Java bằng Interface

Trong Java, đa kế thừa không được hỗ trợ thông qua lớp. Tuy nhiên, nó được hỗ trợ thông qua interface. Đa kế thừa xảy ra khi một lớp triển khai (implements) nhiều interface hoặc khi một interface kế thừa từ nhiều interface khác.

Câu hỏi đặt ra là tại sao đa kế thừa không được hỗ trợ thông qua lớp trong Java? Đa kế thừa thông qua lớp có thể tạo ra sự lưỡng nghĩa (ambiguity) khi trình triển khai được cung cấp bởi lớp triển khai. Điều này không xảy ra với interface vì không có trình triển khai được cung cấp bởi interface.

Ví dụ:

interface Printable {
    void print();
}

interface Showable {
    void show();
}

class TestInterface1 implements Printable, Showable {
    public void print() {
        System.out.println("Hello, I am printable");
    }

    public void show() {
        System.out.println("Hello, I am showable");
    }

    public static void main(String[] args) {
        TestInterface1 obj = new TestInterface1();
        obj.print();
        obj.show();
    }
}

Trong ví dụ trên, chúng ta có hai interface PrintableShowable với các phương thức tương ứng. Lớp TestInterface1 triển khai cả hai interface và triển khai các phương thức print()show(). Khi chúng ta khởi tạo một đối tượng của lớp TestInterface1 và gọi cả hai phương thức, kết quả sẽ là “Hello, I am printable” và “Hello, I am showable”.

Kế thừa Interface trong Java

Một interface có thể kế thừa từ một hoặc nhiều interface khác. Sự kế thừa interface cho phép chúng ta mở rộng các hành vi hiện có trong interface và tái sử dụng chúng trong interface mới.

Ví dụ:

interface A {
    void print();
}

interface B extends A {
    void show();
}

class C implements B {
    public void print() {
        System.out.println("Hello, I am printable");
    }

    public void show() {
        System.out.println("Hello, I am showable");
    }

    public static void main(String[] args) {
        C obj = new C();
        obj.print();
        obj.show();
    }
}

Trong ví dụ trên, chúng ta có hai interface AB. Interface B kế thừa từ interface A và mở rộng phương thức show(). Lớp C triển khai interface B và triển khai cả hai phương thức print()show(). Khi chúng ta khởi tạo một đối tượng của lớp C và gọi cả hai phương thức, kết quả sẽ là “Hello, I am printable” và “Hello, I am showable”.

Marker Interface trong Java là gì?

Một marker (hay tagging) interface là một interface không có phương thức nào. Nó được sử dụng để cung cấp một số thông tin thiết yếu cho JVM để thực hiện các hoạt động hữu ích. Có hai mục đích chính của marker interface:

  1. Tạo một cha chung: Một marker interface có thể được sử dụng để tạo ra một cha chung cho một nhóm interface. Ví dụ, khi một interface kế thừa marker interface EventListener, JVM biết rằng interface đó được sử dụng trong một sự kiện (event).

  2. Thêm một kiểu dữ liệu tới một class: Khi một class triển khai một marker interface, nó trở thành một kiểu interface thông qua tính đa hình (polymorphism).

Ví dụ về marker interface:

import java.io.Serializable;

class Student implements Serializable {
    // code here
}

Trong ví dụ trên, Serializable là một marker interface được sử dụng để cung cấp thông tin cho JVM về cách tuần tự hóa đối tượng Student.

Interface lồng nhau trong Java

Trong Java, chúng ta có thể khai báo interface lồng nhau, tức là một interface có thể chứa một hoặc nhiều interface khác. Điều này giúp tổ chức mã nguồn một cách rõ ràng và giúp tái sử dụng các hành vi của interface.

Ví dụ:

interface OuterInterface {
    void outerMethod();

    interface InnerInterface {
        void innerMethod();
    }
}

class OuterClass implements OuterInterface.InnerInterface {
    public void innerMethod() {
        System.out.println("Hello from inner method");
    }

    public static void main(String[] args) {
        OuterClass obj = new OuterClass();
        obj.innerMethod();
    }
}

Trong ví dụ trên, chúng ta có interface OuterInterface và bên trong nó là interface InnerInterface. Lớp OuterClass triển khai (implements) interface InnerInterface và triển khai phương thức innerMethod(). Khi chúng ta khởi tạo một đối tượng của lớp OuterClass và gọi phương thức innerMethod(), kết quả sẽ là “Hello from inner method”.

Trên đây là một số khái niệm cơ bản về interface trong Java. Sử dụng interface giúp chúng ta tạo ra mã nguồn linh hoạt, dễ bảo trì và tái sử dụng.

FEATURED TOPIC