Java - Giao diện (Interfaces)

Chào mừng, các nhà lập trình nhí! Hôm nay, chúng ta sẽ bơi lội vào thế giới thú vị của Giao diện Java. Đừng lo nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn qua khái niệm này bước từng bước, như cũng như tôi đã làm cho nhiều học sinh khác trong những năm dạy học. Vậy, hãy lấy ly đồ uống yêu thích của bạn, thoải mái ngồi, và hãy cùng nhau bắt đầu hành trình thú vị này!

Java - Interfaces

Giao diện Java là gì?

Hãy tưởng tượng bạn đang xây dựng một robot (hãy tránh nhau, Analogy này sẽ có ý nghĩa trong chốc lát!). Bạn biết bạn muốn robot của mình làm một số việc như di chuyển và tạo ra tiếng, nhưng bạn chưa chắc chắn rõ lắm cách nó sẽ thực hiện những việc này. Trong Java, một giao diện giống như bản kế hoạch cho robot của bạn. Nó xác định những gì robot của bạn nên có thể làm, mà không cần xác định cách nó sẽ thực hiện những việc đó.

Trong lingo lập trình, một giao diện là một hợp đồng xác định một tập hợp các phương thức trừu tượng mà một lớp phải thực thi. Đó là một cách để đạt được trừu tượng và xác định hành vi chung mà nhiều lớp có thể chia sẻ.

Khai báo Giao diện trong Java

Hãy bắt đầu với một ví dụ đơn giản. Đây là cách chúng ta khai báo một giao diện:

public interface Robot {
void move();
void makeSound();
}

Trong ví dụ này, chúng ta đã khai báo một giao diện có tên là Robot với hai phương thức trừu tượng: move()makeSound(). Nhận thấy rằng các phương thức này không có thực thể - chúng chỉ là các khai báo. Nó phụ thuộc vào các lớp thực thi giao diện này để cung cấp mã thực tế cho các phương thức này.

Các tính chất của Giao diện Java

Trước khi tiếp tục, hãy nhanh chóng tóm tắt một số tính chất chính của giao diện Java:

  1. Tất cả các phương thức trong giao diện đều là công khai và trừu tượng một cách ngầm.
  2. Giao diện không thể được khởi tạo trực tiếp.
  3. Một giao diện có thể mở rộng nhiều giao diện.
  4. Các biến trong giao diện là công khai, tĩnh và cuối cùng một cách ngầm.

Thực thi Giao diện trong Java

Bây giờ khi chúng ta có giao diện Robot, hãy tạo ra một lớp thực thi nó. Chúng ta sẽ gọi lớp này là AndroidRobot:

public class AndroidRobot implements Robot {
@Override
public void move() {
System.out.println("Android robot đang đi bằng hai chân.");
}

@Override
public void makeSound() {
System.out.println("Android robot nói: 'Chào, con người!'");
}
}

Ở đây, chúng ta đã sử dụng từ khóa implements để chỉ ra rằng lớp AndroidRobot của chúng ta đang thực thi giao diện Robot. Chúng ta sau đó cung cấp thực thi cho cả hai phương thức move()makeSound().

Hãy phân tích điều này:

  1. Phần đánh dấu @Override là tùy chọn nhưng được khuyến khích. Nó nói với trình biên dịch rằng chúng ta đang có ý định ghi đè một phương thức từ giao diện.
  2. Chúng ta đã cung cấp các thực thi cụ thể cho move()makeSound(). Robot Android của chúng ta đi bằng hai chân và có thể nói chào!

Sử dụng Giao diện và Lớp của chúng ta

Bây giờ, hãy xem cách chúng ta có thể sử dụng giao diện và lớp mới của chúng ta:

public class RobotDemo {
public static void main(String[] args) {
Robot myRobot = new AndroidRobot();
myRobot.move();
myRobot.makeSound();
}
}

Khi chúng ta chạy mã này, chúng ta sẽ thấy:

Android robot đang đi bằng hai chân.
Android robot nói: 'Chào, con người!'

Nhận thấy rằng chúng ta khai báo myRobot với kiểu Robot (giao diện) nhưng khởi tạo nó như một AndroidRobot. Đây là một tính năng mạnh mẽ của giao diện - chúng ta có thể lập trình cho giao diện, không phải thực thể. Điều này làm cho mã của chúng ta linh hoạt hơn và dễ dàng thay đổi trong tương lai.

Mở rộng Giao diện Java

Giống như các lớp, giao diện có thể mở rộng các giao diện khác. Điều này cho phép chúng ta tạo ra các giao diện chuyên sâu hơn. Hãy tạo ra một giao diện robot tiên tiến hơn:

public interface AdvancedRobot extends Robot {
void fly();
void swim();
}

Bây giờ, bất kỳ lớp nào thực thi AdvancedRobot phải cung cấp thực thi cho move(), makeSound(), fly()swim().

Đa hệ thống với Giao diện

Không giống như các lớp, chỉ có thể mở rộng một lớp cha, một giao diện có thể mở rộng nhiều giao diện. Đây là một cách Java cung cấp một hình thức của đa hệ thống. Dưới đây là một ví dụ:

public interface Flying {
void takeOff();
void land();
}

public interface Swimming {
void dive();
void surface();
}

public interface AmphibiousRobot extends Robot, Flying, Swimming {
void transformMode();
}

Một lớp thực thi AmphibiousRobot sẽ cần cung cấp thực thi cho tất cả các phương thức từ Robot, Flying, Swimming, và AmphibiousRobot.

Phương thức Mặc định trong Giao diện

Từ Java 8, giao diện có thể có các phương thức mặc định - các phương thức có thực thi mặc định. Tính năng này được giới thiệu để cho phép thêm các phương thức mới vào giao diện mà không làm hỏng các thực thi hiện có. Dưới đây là một ví dụ:

public interface ModernRobot {
void process();

default void boot() {
System.out.println("Đang khởi động...");
process();
System.out.println("Khởi động hoàn tất!");
}
}

Các lớp thực thi ModernRobot phải thực thi process(), nhưng chúng nhận boot() miễn phí. Chúng có thể ghi đè boot() nếu muốn, nhưng không cần phải.

Giao diện Hàm

Một giao diện hàm là một giao diện chứa đúng một phương thức trừu tượng. Các giao diện này rất quan trọng cho các biểu thức lambda của Java. Dưới đây là một ví dụ:

@FunctionalInterface
public interface Calculator {
int calculate(int a, int b);
}

Chúng ta có thể sử dụng giao diện này với một biểu thức lambda như sau:

Calculator add = (a, b) -> a + b;
System.out.println(add.calculate(5, 3));  // Xuất ra: 8

Kết luận

Phew! Chúng ta đã bề ngoài rất nhiều đất nước hôm nay. Từ khai báo giao diện cơ bản đến các giao diện hàm, bạn đã có một nền tảng vững chắc trong các giao diện Java. Hãy nhớ rằng, các giao diện là một công cụ mạnh mẽ trong lập trình Java. Chúng cho phép chúng ta xác định hành vi chung, đạt được một hình thức của đa hệ thống, và viết mã linh hoạt và dễ bảo trì hơn.

Khi bạn tiếp tục hành trình Java của mình, bạn sẽ thấy các giao diện xuất hiện mọi nơi. Chúng được sử dụng rộng rãi trong các thư viện tiêu chuẩn của Java và nhiều mẫu thiết kế. Vậy hãy tiếp tục tập luyện, và sớm bạn sẽ giao diện như một chuyên gia!

Chúc mãi mãi lập trình vui vẻ, các nhà lập trình Java tương lai! ??‍??‍?

Credits: Image by storyset