Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 16: Interface trong Java

Ở những bài trước mình cũng có sử dụng interface rồi nhưng chưa giải thích về nó, nên bài này mình sẽ giới thiệu với mọi người về interface trong Java và những thứ liên quan đến nó.

1. Interface trong Java.

Trong Java interface là một kiểu dữ liệu tham chiếu (reference type), giống như class. Nó cho phép chúng ta định nghĩa hằng số, tên phương thức, phương thức tĩnh, và phương thức default.

Đối với phương thức tĩnh và phương thức default thì chúng ta có thể khai báo chúng như đối với class thường (có code logic bên trong).

Để khai báo một interface chúng ta sử dụng cú pháp sau:

access_modifier interface Name {
	// code
}

Trong đó:

  • assess_modifier là phạm vi truy cập của interface. assess_modifier sẽ là 1 trong 4 giá trị sau: public, protected, private, default hoặc bỏ trống.
  • Name là tên của interface.

VD: Định nghĩa interface XeInterface.

public interface XeInterface {
  void setSoBanh(int soBanh);

  int getSoBanh();

  void setTocDo(int tocDo);

  int getTocDo();

  public static void Print(String message) {
    System.out.println(message);
  }
}

Interface cũng có thể kế thừa một hoặc nhiều interface khác với cú pháp tương tự như đối với class.

VD: Kế thừa interface.

public interface XeInterface {
  // code
}

public interface XeDapInterface extends XeInterface {
  // code
}

public interface XeDienInterface extends XeInterface {
  // code	
}

public interface XeDapDienInterface extends XeDapInterface, XeDienInterface {
  // code
}

Trong ví dụ trên mình đã khai báo interface XeDapInterface kế thừa XeInterfaceXeDienInterface kế thừa XeInterface. Rồi tiếp đó mình lại khai báo XeDapDienInterface kế thừa XeDapInterfaceXeDienInterface.

2. Thực thi (implement) interface.

Khi thực thi (implement) một interface thì chúng ta cần phải Override lại các phương thức đã được định nghĩa tên ở interface (chỉ những phương thức thường). Và kiểu dữ liệu trả về của phương thức phải giống với kiểu dữ liệu trả về đã được khai báo ở interface, tham số truyền vào phương thức cũng phải có kiểu dữ liệu giống như đã khai báo trong interface.

Để thực thi một interface thì chúng ta sử dụng từ khóa implements sau tên class khi định nghĩa. Và cũng giống như interface thì một class có thể thực thi nhiều interface với cú pháp tương tự với interface.

VD: Mình sẽ thực thi lại XeInterface ở ví dụ trên.

- XeInterface:

public interface XeInterface {
  void setSoBanh(int soBanh);

  int getSoBanh();

  void setTocDo(int tocDo);

  int getTocDo();

  public static void print(String message) {
    System.out.println(message);
  }
}

- class Xe.java:

public class Xe implements XeInterface {
  private int soBanh;
  private int tocDo;

  @Override
  public void setSoBanh(int soBanh) {
    this.soBanh = soBanh;
  }

  @Override
  public int getSoBanh() {
    return soBanh;
  }

  @Override
  public void setTocDo(int tocDo) {
    this.tocDo = tocDo;
  }

  @Override
  public int getTocDo() {
    return tocDo;
  }
}

Như các bạn đã thấy thì ở class Xe mình phải định nghĩa lại toàn bộ phương thức thường đã được khai báo tên ở trong XeInterface, nếu không định nghĩa lại thì trình biên dịch sẽ báo lỗi. Riêng đối với phương thức defaultstatic method thì các bạn không cần phải định nghĩa lại.

3. Dùng interface như một kiểu dữ liệu.

Như ở phía trên mình có nói interface là một kiểu dữ liệu tham chiếu nên khi các bạn khai báo một class có implement interface thì chúng ta hoàn toàn có thể khởi tạo đối tượng đó với kiểu dữ liệu là interface đó.

VD: Khởi tạo class Xe ở trên với kiểu dữ liệu là interface XeInterface.

public class Main {
  public static void main(String[] args) {
    XeInterface xe = new Xe();
  }
}

Khi một class có implement interface thì khi check instanceof object đó với interface thì kết quả vẫn sẽ trả về true.

VD:

public class Main {
  public static void main(String[] args) {
    Xe xe = new Xe();

    if (xe instanceof XeInterface) {
      System.out.println("Xe instanceof XeInterface");
    }
  }
}

4. Mức độ ưu tiên phương thức.

Mức độ ưu tiên trong interface về cơ bản thì cũng giống như class.

Trong Java các method được khai báo trong class sẽ được ưu tiên hơn trong interface.

VD: Mình có khai báo các class và inteface như sau

- XeInterface

public interface XeInterface {
  default void print() {
    System.out.println("This is XeInterface");
  }
}

- class Xe.java

public class Xe {
  public void print() {
    System.out.println("This is Xe");
  }
}

- class XeDap.java

public class XeDap extends Xe implements XeInterface {
  // code
}

- class Main.java

public class Main {
  public static void main(String[] args) {
    XeDap xeDap = new XeDap();
    xeDap.print();
  }
}

Kết quả:

This is Xe

Như các bạn đã thấy, method print được khai báo trong class Xe sẽ được ưu tiên hơn so với interface XeInterface.

Để gọi phương thức đã bị ghi đè trong interface chúng ta cũng sử dụng từ khóa super, nhưng trước đó chúng ta cần xác định thêm interface name phía trước nó để Java hiểu được bạn cần gọi method của interface nào.

VD:

- XeInterface

public interface XeInterface {
  default void print() {
    System.out.println("This is XeInterface");
  }
}

- class Xe.java

public class Xe implements XeInterface {
  public void print() {
    XeInterface.super.print();
    System.out.println("This is Xe");
  }
}

- class Main.java

public class Main {
  public static void main(String[] args) {
    XeDap xeDap = new XeDap();
    xeDap.print();
  }
}

Kết quả:

This is XeInterface
This is Xe

5. Lời kết.

Interface xuất hiện ở mọi nơi trong Java, chính vì vậy mọi người nên để ý hơn về phần này.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

2 Comments

Cảm ơn anh

CườngNT

2 năm trước

ありがとうございます。

強元

2 năm trước

Bình luận

Captcha