"Xin chào, Amigo! Hôm nay bạn sẽ thực hiện một số khám phá. Chủ đề của ngày hôm nay—drum roll, xin vui lòng—là giao diện. "

"Yep. Một ngày tuyệt vời đến nỗi tôi phải về nhà để tắm."

" Một giao diện là con của Trừu tượng và Đa hình. Giao diện rất giống một lớp trừu tượng trong đó tất cả các phương thức đều là trừu tượng. Nó được khai báo giống như một lớp, nhưng với từ khóa . Dưới đây là một số ví dụ: interface"

Mã số Mô tả và sự kiện
interface Drawable
{
void draw();
}
interface HasValue
{
int getValue();
}
1) Thay vì từ class, chúng tôi viết interface.

2) Nó chỉ chứa các phương thức trừu tượng (không cần thêm từ trừu tượng).

3) Trên thực tế, tất cả các phương thức trên giao diện đều công khai.

interface Element extends Drawable, HasValue
{
int getX();
int getY();
}
Một giao diện chỉ có thể kế thừa các giao diện khác.

Bạn có thể có nhiều giao diện cha mẹ.

class abstract ChessItem implements Drawable, HasValue
{
private int x, y, value;

public int getValue()
{
return value;
}

public int getX()
{
return x;
}

public int getY()
{
return y;
}

}
Một lớp có thể kế thừa nhiều giao diện (và chỉ một lớp). Để hiển thị sự kế thừa này, chúng tôi sử dụng từ khóa  implements.

Lớp này ChessItem được khai báo là trừu tượng: nó thực hiện tất cả các phương thức kế thừa ngoại trừ phương thức vẽ.

Nói cách khác, ChessItem chứa một phương thức trừu tượng:  draw().

"Thật thú vị. Nhưng tại sao chúng ta cần giao diện? Chúng được sử dụng khi nào?"

"Giao diện có hai lợi thế mạnh so với các lớp:"

1) Tách "định nghĩa phương thức" khỏi triển khai phương thức.

Trước đây tôi đã nói với bạn rằng nếu bạn muốn cho phép các lớp khác gọi các phương thức của lớp bạn, thì bạn cần đánh dấu chúng làpublic . Nếu bạn muốn một số phương thức nhất định chỉ được gọi từ lớp của chính bạn, thì chúng phải được đánh dấu private. Nói cách khác, chúng ta đang chia các phương thức của lớp thành hai loại: «dành cho mọi người» và «chỉ dành cho tôi».

Chúng ta có thể sử dụng các giao diện để tăng cường sự tách biệt này hơn nữa. Chúng tôi sẽ tạo ra một "lớp học dành cho mọi người" đặc biệt sẽ kế thừa "lớp học dành riêng cho tôi" thứ hai. Điều đó sẽ giống như thế này:

Trước
class Student
{
 private String name;

 public Student(String name)
 {
  this.name = name;
 }

 public String getName()
 {
  return this.name;
 }

 private void setName(String name)
 {
  this.name = name;
 }
Sau đó
interface Student
{
 public String getName();
}

class StudentImpl implements Student
{
 private String name;
 public StudentImpl(String name)
 {
  this.name = name;
 }
 public String getName()
 {
  return this.name;
 }
 private void setName(String name)
 {
  this.name = name;
 }
}
Trước
public static void main(String[] args)
{
 Student student =
               new Student("Alibaba");
 System.out.println(student.getName());
}
Sau đó
public static void main(String[] args)
{
 Student student =
               new StudentImpl("Ali");
 System.out.println(student.getName());
}

Chúng tôi chia lớp của chúng tôi thành hai phần: một giao diệnmột lớp thực hiện giao diện.

"Vậy ưu điểm là gì?"

"Cùng một giao diện có thể được triển khai bởi (kế thừa) các lớp khác nhau. Và mỗi lớp có thể có hành vi riêng. Giống như ArrayListLinkedList là hai cách triển khai khác nhau của giao diện Danh sách. "

Do đó, chúng tôi không chỉ ẩn các triển khai khác nhau mà còn cả các lớp chứa các triển khai đó (chúng tôi chỉ có thể sử dụng các giao diện ở mọi nơi trong mã). Điều này cho phép chúng ta thay thế rất linh hoạt một số đối tượng bằng các đối tượng khác trong khi chương trình đang chạy, thay đổi hành vi của đối tượng mà không cần biết bất kỳ lớp nào sử dụng nó.

Kết hợp với đa hình, đây là một kỹ thuật rất mạnh. Hiện tại, vẫn chưa rõ tại sao chúng ta cần phải làm điều này. Trước tiên, bạn phải gặp các chương trình bao gồm hàng chục hoặc hàng trăm lớp để đánh giá cao cách các giao diện có thể đơn giản hóa cuộc sống của bạn.

2) Đa kế thừa.

Trong Java, mỗi lớp chỉ có thể có một lớp cha. Trong các ngôn ngữ lập trình khác, các lớp thường có thể có nhiều lớp cha. Điều này rất thuận tiện, nhưng nó cũng tạo ra rất nhiều vấn đề.

Java đưa ra một thỏa hiệp:   bạn không thể kế thừa nhiều lớp, nhưng bạn có thể triển khai nhiều giao diện. Một giao diện có thể có một số giao diện cha.  Một lớp có thể triển khai nhiều giao diện và chỉ kế thừa một lớp cha.