มรดก เป็นความสัมพันธ์ระหว่างสองคลาสโดยที่คลาสหนึ่งสืบทอดคุณสมบัติของคลาสอื่น ความสัมพันธ์นี้สามารถกำหนดได้โดยใช้คีย์เวิร์ดขยายเป็น −
public class A extends B{
}
คลาสที่สืบทอดคุณสมบัติเรียกว่าคลาสย่อยหรือคลาสย่อยและคลาสที่มีคุณสมบัติที่สืบทอดมาคือ super class หรือ parent class
ในการสืบทอด สำเนาของสมาชิก super class จะถูกสร้างขึ้นในวัตถุคลาสย่อย ดังนั้น การใช้อ็อบเจ็กต์คลาสย่อย คุณสามารถเข้าถึงสมาชิกของทั้งสองคลาสได้
การสืบทอดหลายรายการเป็นที่ที่คลาสหนึ่งสืบทอดคุณสมบัติของหลายคลาส กล่าวอีกนัยหนึ่ง ในการสืบทอดหลายรายการ เราสามารถมีคลาสลูกหนึ่งคลาสและคลาสพาเรนต์จำนวน n รายการ Java ไม่รองรับการสืบทอดหลายรายการ (พร้อมคลาส)
ปัญหาเพชร
- ตัวอย่างเช่น สมมติว่า Java รองรับการสืบทอดหลายรายการ
- และถ้าเรามีคลาสนามธรรมชื่อ Sample ด้วยวิธีการเชิงนามธรรม demo()
- จากนั้น หากอีกสองคลาสในแพ็คเกจเดียวกันขยายคลาสนี้และพยายามใช้วิธีนามธรรม demo()
- จากนั้น ตามกฎพื้นฐานของการสืบทอด ควรสร้างสำเนาของทั้งสองวิธี demo() ในออบเจ็กต์คลาสย่อย ซึ่งปล่อยให้คลาสย่อยมีสองเมธอดที่มีต้นแบบเดียวกัน (ชื่อและอาร์กิวเมนต์)
- จากนั้น หากคุณเรียกใช้เมธอด demo() โดยใช้อ็อบเจ็กต์ของคอมไพเลอร์คลาสย่อย จะเผชิญกับสถานการณ์ที่คลุมเครือโดยไม่รู้ว่าจะเรียกใช้เมธอดใด ปัญหานี้เรียกว่าปัญหาเพชรใน Java
วิธีแก้ปัญหาเพชร
คุณสามารถรับมรดกหลายอย่างใน Java โดยใช้วิธีการเริ่มต้น (Java8) และอินเทอร์เฟซ
จาก Java8 บนวอร์ด วิธีการเริ่มต้น ถูกนำเสนอในอินเทอร์เฟซ ต่างจากวิธีนามธรรมอื่น ๆ วิธีเหล่านี้เป็นวิธีการของอินเทอร์เฟซที่มีการใช้งานเริ่มต้น หากคุณมีวิธีการเริ่มต้นในอินเทอร์เฟซ ไม่จำเป็นต้องแทนที่ (ระบุเนื้อหา) ในคลาสที่ใช้อินเทอร์เฟซนี้อยู่แล้ว
คุณสามารถมีวิธีการเริ่มต้นที่เหมือนกัน (ชื่อและลายเซ็นเดียวกัน) ในอินเทอร์เฟซสองแบบที่แตกต่างกัน และจากคลาส คุณสามารถใช้อินเทอร์เฟซทั้งสองนี้ได้
หากคุณทำเช่นนั้น คุณต้องแทนที่เมธอดดีฟอลต์จากคลาสโดยระบุเมธอดเริ่มต้นอย่างชัดแจ้งพร้อมกับชื่ออินเตอร์เฟส
ตัวอย่าง
interface MyInterface1{ public static int num = 100; public default void display() { System.out.println("display method of MyInterface1"); } } interface MyInterface2{ public static int num = 1000; public default void display() { System.out.println("display method of MyInterface2"); } } public class InterfaceExample implements MyInterface1, MyInterface2{ public void display() { MyInterface1.super.display(); //or, MyInterface2.super.display(); } public static void main(String args[]) { InterfaceExample obj = new InterfaceExample(); obj.display(); } }
ผลลัพธ์
display method of MyInterface1 display method of MyInterface2