จากhttps://dzone.com/articles/interface-default-methods-java
Java 8 แนะนำคุณลักษณะใหม่“ Default Method” หรือ (Defender method) ซึ่งช่วยให้นักพัฒนาสามารถเพิ่มวิธีการใหม่ ๆ ให้กับอินเทอร์เฟซได้โดยไม่ทำลายการใช้งานอินเทอร์เฟซที่มีอยู่เดิม ให้ความยืดหยุ่นในการอนุญาตให้ใช้อินเทอร์เฟซกำหนดการใช้งานซึ่งจะใช้เป็นค่าเริ่มต้นในสถานการณ์ที่คลาสคอนกรีตไม่สามารถจัดเตรียมการใช้งานสำหรับวิธีการนั้นได้
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
มีคำถามทั่วไปอย่างหนึ่งที่ผู้คนถามเกี่ยวกับวิธีการเริ่มต้นเมื่อพวกเขาได้ยินเกี่ยวกับคุณลักษณะใหม่เป็นครั้งแรก:
จะเกิดอะไรขึ้นถ้าคลาสใช้สองอินเทอร์เฟซและทั้งสองอินเทอร์เฟซเหล่านั้นกำหนดวิธีการเริ่มต้นด้วยลายเซ็นเดียวกัน
ตัวอย่างเพื่อแสดงสถานการณ์นี้:
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 {
}
รหัสนี้ไม่สามารถรวบรวมด้วยผลลัพธ์ต่อไปนี้:
java: class Clazz inherits unrelated defaults for foo() from types A and B
ในการแก้ไขใน Clazz เราต้องแก้ไขด้วยตนเองโดยการลบล้างวิธีการที่ขัดแย้งกัน:
public class Clazz implements A, B {
public void foo(){}
}
แต่จะเกิดอะไรขึ้นถ้าเราต้องการเรียกการใช้งาน method foo () เริ่มต้นจากอินเทอร์เฟซ A แทนการใช้งานของเราเอง
สามารถอ้างถึง A # foo () ได้ดังนี้:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}