Bài học theo mô-đun (1/2)
Giao diện
Mặc dù các lớp trừu tượng có thể chứa cả trường mã và trường phiên bản được triển khai một phần, giao diện trong Java là hợp đồng của hành vi thuần túy. Một giao diện xác định những gì một lớp phải có thể làm, nhưng không xác định làm thế nào nó thực hiện được.
Điều này cho phép tách rời hoàn toàn giữa định nghĩa hoạt động và việc triển khai thực tế của chúng.
Xác định Giao diện (interface)
Chúng tôi sử dụng từ khóa interface. Tất cả các phương thức được khai báo trong một giao diện đều ngầm định là public và abstract (không cần chỉ định nó):
interface Drivable {
void startEngine();
void stopEngine();
}Triển khai Giao diện (implements)
Một lớp triển khai giao diện bằng từ khóa implements và được yêu cầu cung cấp cách triển khai (có nội dung) cho tất cả các phương thức được xác định:
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}Ưu điểm của giao diện
- Đa kế thừa: Trong Java, một lớp có thể mở rộng only one lớp cha (kế thừa đơn), nhưng nó có thể triển khai nhiều giao diện cùng một lúc.
Java
class HybridCar implements Drivable, Chargeable { ... } - Tách rời: Bạn có thể xác định các biến bằng loại giao diện. Bất kỳ đối tượng nào triển khai giao diện đó đều có thể được gán cho một biến như vậy.
Java
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
Các hằng số trong giao diện
Trong giao diện, có thể khai báo các trường. Các trường này hoàn toàn là public static final (nghĩa là các hằng số lớp), ngay cả khi bạn không chỉ định các công cụ sửa đổi này. Do đó, chúng phải được khởi tạo ngay khi khai báo:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitly public static final
}Phương thức mặc định (default)
Bắt đầu từ Java 8, có thể xác định các phương thức có cách triển khai mặc định bên trong giao diện bằng cách sử dụng từ khóa default. Các phương thức này không buộc các lớp triển khai ghi đè lên chúng, cung cấp hành vi dự phòng:
interface Logger {
void log(String message);
// Default method with a body
default void logError(String message) {
log("ERROR: " + message);
}
}Hãy tự mình thử
Tạo giao diện Flyable bằng phương thức void fly(). Sau đó, triển khai lớp Bird triển khai Flyable và in Bay ra màn hình.
Hiển thị gợi ý
Trong Flyable viết `void fly();`. Trong lớp Bird, hãy triển khai phương thức đánh dấu nó bằng `@Override public void fly() { System.out.println('Flying'); }`.
Giải pháp khả dụng sau 3 lần thử
Xác định giao diện Drawable bằng phương thức void draw(). Sau đó triển khai lớp Hình chữ nhật triển khai Có thể vẽ và in Hình chữ nhật Vẽ.
Hiển thị gợi ý
Xác định `void draw();` trong giao diện. Trong Hình chữ nhật, sử dụng `@Ghi đè public void draw() { System.out.println('Vẽ hình chữ nhật'); }`.
Giải pháp khả dụng sau 3 lần thử
Hoàn thành giao diện Swimmable bằng cách xác định phương thức void swim(). Sau đó, hoàn thành lớp Duck để nó triển khai cả Flyable và Swimmable, in phương thức Flying in the fly() và phương thức Swimming in the swim().
Hiển thị gợi ý
Khai báo `void swim();` bên trong Swimmable. Khai báo `class Duck thực hiện Flyable, Swimmable` và triển khai cả hai phương thức in các chuỗi được yêu cầu.
Giải pháp khả dụng sau 3 lần thử