มรดก เป็นความสัมพันธ์ระหว่างสองคลาสโดยที่คลาสหนึ่งสืบทอดคุณสมบัติของคลาสอื่น ความสัมพันธ์นี้สามารถกำหนดได้โดยใช้คีย์เวิร์ดขยายเป็น −
public class A extends B{ }
คลาสที่สืบทอดคุณสมบัติเรียกว่าคลาสย่อยหรือคลาสย่อยและคลาสที่มีคุณสมบัติที่สืบทอดมาคือ super class หรือ parent class
ในการสืบทอด สำเนาของสมาชิก super class จะถูกสร้างขึ้นในวัตถุคลาสย่อย ดังนั้น การใช้อ็อบเจ็กต์คลาสย่อย คุณสามารถเข้าถึงสมาชิกของทั้งสองคลาสได้
มรดกหลายอย่าง:
การสืบทอดมีหลายประเภท ได้แก่ เดี่ยว หลายระดับ ลำดับชั้น หลายรายการ และแบบผสม
ในการสืบทอดหลายคลาส คลาสหนึ่งสืบทอดคุณสมบัติของหลายคลาส กล่าวอีกนัยหนึ่ง ในการสืบทอดหลายรายการ เราสามารถมีคลาสลูกหนึ่งคลาสและคลาสพาเรนต์จำนวน n รายการ Java ไม่รองรับการสืบทอดหลายรายการ (พร้อมคลาส)
ปัญหาเพชร
ตัวอย่างเช่น สมมติว่า Java รองรับการสืบทอดหลายรายการ ด้วยสมมติฐานดังกล่าว ให้พิจารณาตัวอย่างต่อไปนี้
ตัวอย่าง
ที่นี่ เรามีคลาสนามธรรมชื่อ ตัวอย่าง ด้วยวิธีนามธรรมเป็น −
public class abstract Sample { public abstract demo(); }
จากนั้นในแพ็คเกจ/โฟลเดอร์เดียวกัน เรามีสองคลาสที่ขยายคลาสนี้และพยายามใช้วิธีนามธรรม demo()
public class Super1 extends Sample{ public void demo() { System.out.println("demo method of super1"); } } public class Super2 extends Sample{ public void demo() { System.out.println("demo method of super2"); } }
ตามสมมติฐานของเรา เนื่องจาก Java รองรับการสืบทอดหลายรายการ เราจึงพยายามสืบทอดทั้งคลาส Super1 และ Super2
public class SubClass extends Super1, Super2 { public static void main(String args[]) { SubClass obj = new SubClass(); obj.demo(); } }
จากนั้น ตามกฎพื้นฐานของการสืบทอด ควรสร้างสำเนาของทั้งสองวิธี demo() ในออบเจ็กต์คลาสย่อย ซึ่งปล่อยให้คลาสย่อยมีสองเมธอดที่มีต้นแบบเดียวกัน (ชื่อและอาร์กิวเมนต์) จากนั้น หากคุณเรียกใช้เมธอด demo() โดยใช้อ็อบเจ็กต์ของคอมไพเลอร์คลาสย่อย จะเผชิญกับสถานการณ์ที่คลุมเครือโดยไม่รู้ว่าจะเรียกใช้เมธอดใด ปัญหานี้เรียกว่าปัญหาเพชรใน Java
เนื่องจาก Java นี้ไม่รองรับการสืบทอดหลายรายการ กล่าวคือ คุณไม่สามารถขยายคลาสอื่นได้มากกว่าหนึ่งคลาส อย่างไรก็ตาม หากคุณพยายามทำเช่นนั้น จะเกิดข้อผิดพลาดในการคอมไพล์
ข้อผิดพลาดในการคอมไพล์เวลา
ในการคอมไพล์ โปรแกรมข้างต้นสร้างข้อผิดพลาดดังต่อไปนี้ -
MultipleInheritanceExample.java:9: error: '{' expected public class MultipleInheritanceExample extends MyInterface1, MyInterface2{ ^ 1 error
วิธีแก้ปัญหา
คุณสามารถรับมรดกหลายอย่างใน 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