Từ https://dzone.com/articles/interface-default-methods-java
Java 8 giới thiệu tính năng mới “Phương pháp mặc định” hoặc (Phương pháp của người bảo vệ), cho phép nhà phát triển thêm các phương thức mới vào giao diện mà không phá vỡ việc triển khai hiện có của giao diện này. Nó cung cấp tính linh hoạt để cho phép thực hiện xác định giao diện sẽ sử dụng làm mặc định trong trường hợp một lớp cụ thể không cung cấp triển khai cho phương thức đó.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Có một câu hỏi phổ biến mà mọi người hỏi về các phương pháp mặc định khi họ nghe về tính năng mới lần đầu tiên:
Điều gì sẽ xảy ra nếu lớp triển khai hai giao diện và cả hai giao diện đó xác định một phương thức mặc định với cùng một chữ ký?
Ví dụ minh họa tình huống này:
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public interface B {
default void foo(){
System.out.println("Calling B.foo()");
}
}
public class ClassAB implements A, B {
}
Mã này không thể biên dịch với kết quả sau:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Để khắc phục điều đó, trong Clazz, chúng tôi phải giải quyết nó theo cách thủ công bằng cách ghi đè phương thức xung đột:
public class Clazz implements A, B {
public void foo(){}
}
Nhưng điều gì sẽ xảy ra nếu chúng ta muốn gọi việc triển khai mặc định của phương thức foo () từ giao diện A thay vì triển khai của riêng chúng ta.
Có thể tham chiếu đến A # foo () như sau:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}