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

Xin chào các nhà phát triển Java tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới các phương thức mặc định của Java. Đừng lo nếu bạn mới bắt đầu học lập trình; tôi sẽ là người hướng dẫn bạn thân thiện, và chúng ta sẽ khám phá khái niệm này cùng nhau bước từng bước. Vậy hãy lấy ra cây cọ (hoặc bàn phím) ảo của bạn, và hãy bắt đầu!

Java - Default Methods

Phương thức Mặc định là gì?

Hãy tưởng tượng bạn là một phần của một gia đình lớn (gọi nó là gia đình Giao diện), và bạn luôn có một bộ quy tắc mà mọi người đều tuân theo. Nhưng đột ngột bạn nhận ra rằng bạn cần một quy tắc mới, và bạn không muốn buộc mọi thành viên trong gia đình của mình phải thực hiện ngay lập tức. Đó là lúc các phương thức mặc định đến gần cứu rỗi!

Trong lingo của Java, các phương thức mặc định cho phép bạn thêm các phương thức mới vào giao diện mà không làm hỏng các lớp kế thừa các giao diện này. Nó như thêm một quy tắc mới vào gia đình của bạn, nhưng đưa cho mọi người cách thức mặc định để tuân theo nếu họ không muốn nghĩ ra cách riêng của mình.

Cú pháp

Dưới đây là cách bạn khai báo một phương thức mặc định:

public interface MyInterface {
default void myDefaultMethod() {
System.out.println("Đây là một phương thức mặc định");
}
}

Nhận thấy từ khóa default trước khi khai báo phương thức. Nó như nói: "Nếu bạn không có cách của riêng mình để làm điều này, dưới đây là cách mặc định cho bạn!"

Ví dụ về Phương thức Mặc định Java

Hãy xem một ví dụ cụ thể hơn. Hãy tưởng tượng chúng ta đang tạo một trò chơi đơn giản nơi các nhân vật có thể thực hiện các hành động.

public interface Character {
void move();

default void speak() {
System.out.println("Xin chào, tôi là một nhân vật trong trò chơi này!");
}
}

public class Hero implements Character {
@Override
public void move() {
System.out.println("Anh hùng di chuyển nhanh chóng");
}
}

public class Villain implements Character {
@Override
public void move() {
System.out.println("Kẻ xấu trốn trộm");
}

@Override
public void speak() {
System.out.println("Tôi là kẻ xấu! Sợ tôi!");
}
}

public class GameDemo {
public static void main(String[] args) {
Character hero = new Hero();
Character villain = new Villain();

hero.move();    // Output: Anh hùng di chuyển nhanh chóng
hero.speak();   // Output: Xin chào, tôi là một nhân vật trong trò chơi này!

villain.move(); // Output: Kẻ xấu trốn trộm
villain.speak(); // Output: Tôi là kẻ xấu! Sợ tôi!
}
}

Trong ví dụ này, chúng ta có một giao diện Character với phương thức mặc định speak(). Lớp Hero sử dụng triển khai mặc định, trong khi lớp Villain ghi đè nó. Nó như đưa cho các nhân vật một đoạn đối thoại mặc định, nhưng cho phép kẻ xấu có đoạn đối thoại kịch tính riêng!

Phương thức Mặc định trong Đa kế thừa

Bây giờ, hãy làm cho thứ gì đó phức tạp hơn. Điều gì xảy ra khi một lớp thực hiện nhiều giao diện có các phương thức mặc định có cùng tên? Nó như có hai thành viên trong gia đình đưa ra lời khuyên khác nhau về cách làm điều gì!

public interface Flyer {
default void takeOff() {
System.out.println("Phương tiện bay khởi hành");
}
}

public interface Spaceship {
default void takeOff() {
System.out.println("Tàu vũ trụ khởi phát");
}
}

public class FlyingSpaceship implements Flyer, Spaceship {
// Chúng ta phải ghi đè phương thức takeOff để giải quyết xung đột
@Override
public void takeOff() {
Flyer.super.takeOff(); // Gọi phương thức takeOff của Flyer
Spaceship.super.takeOff(); // Gọi phương thức takeOff của Spaceship
}
}

public class SpaceDemo {
public static void main(String[] args) {
FlyingSpaceship ship = new FlyingSpaceship();
ship.takeOff();
}
}

Trong trường hợp này, FlyingSpaceship phải ghi đè phương thức takeOff() để giải quyết xung đột. Nó như là người đại sứ trong gia đình và tìm cách tuân theo cả hai lời khuyên!

Phương thức Mặc định Tĩnh trong Java

Nhấn chìa khóa vào, vì đây là một chuyển đổi剧情: Java không cho phép các phương thức mặc định tĩnh trong giao diện! Nhưng đừng lo, có lý do tốt để điều này. Các phương thức tĩnh thuộc về giao diện chính nó, không phải là các đối tượng thực hiện giao diện.

Tuy nhiên, Java 8 đã giới thiệu các phương thức tĩnh trong giao diện. Hãy xem cách chúng hoạt động:

public interface MathOperations {
static int add(int a, int b) {
return a + b;
}

default int subtract(int a, int b) {
return a - b;
}
}

public class Calculator implements MathOperations {
// Không cần thực hiện các phương thức tĩnh
}

public class MathDemo {
public static void main(String[] args) {
Calculator calc = new Calculator();

System.out.println("5 + 3 = " + MathOperations.add(5, 3)); // Gọi phương thức tĩnh trên giao diện
System.out.println("5 - 3 = " + calc.subtract(5, 3)); // Gọi phương thức mặc định trên đối tượng
}
}

Ở đây, add() là một phương thức tĩnh thuộc về giao diện MathOperations, trong khi subtract() là một phương thức mặc định có thể được sử dụng bởi bất kỳ lớp nào thực hiện giao diện.

Kết luận

Và thế là, các học việc Java tương lai! Chúng ta đã hành trình qua thế giới các phương thức mặc định, khám phá các tình huống đa kế thừa, và thậm chí chạm vào các phương thức tĩnh trong giao diện. Các phương thức mặc định như những cây cọ đa năng trong bộ công cụ Java của bạn - chúng giúp bạn thêm các chức năng mới vào giao diện mà không làm hỏng các triển khai hiện có.

Hãy nhớ, với quyền lớn đến đến trách nhiệm lớn. Sử dụng các phương thức mặc định một cách khôn ngoan để phát triển giao diện của bạn trong khi duy trì tính tương thích ngược lại. Chúc các bạn một cuộc hành trình lập trình thú vị và đầy ma thuật của các phương thức mặc định!

Loại Phương thức Cú pháp Cách sử dụng
Phương thức Mặc định default returnType methodName(parameters) { // implementation } Được sử dụng trong giao diện để cung cấp cách thức mặc định
Phương thức Tĩnh static returnType methodName(parameters) { // implementation } Được sử dụng trong giao diện cho các phương thức tiện ích không cần đối tượng
Phương thức Trừu tượng returnType methodName(parameters); Được sử dụng trong giao diện để khai báo phương thức không có triển khai

Credits: Image by storyset