มรดก เป็นความสัมพันธ์ระหว่างสองคลาสโดยที่คลาสหนึ่งสืบทอดคุณสมบัติของคลาสอื่น ความสัมพันธ์นี้สามารถกำหนดได้โดยใช้คีย์เวิร์ดขยายเป็น −
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