ใน Java ในระหว่างกระบวนการสร้างคลาสย่อย จะต้องเรียก Constructor ของคลาสพาเรนต์ เนื่องจากเมื่อมีความสัมพันธ์แบบสืบทอด คลาสย่อยจะต้องสืบทอดเนื้อหาของคลาสพาเรนต์โดยวิธีใด
คำตอบมีดังนี้:
เมื่อคุณสร้างวัตถุคลาสย่อยใหม่ คุณต้องสร้างวัตถุใหม่ของคลาสหลักนี้อยู่ภายในวัตถุคลาสย่อย ดังนั้น วัตถุคลาสย่อยจึงมีขนาดใหญ่กว่าวัตถุคลาสย่อยประกอบด้วยนี่คือ สถานการณ์จริงในหน่วยความจำ เมื่อวิธีการก่อสร้างเป็นวัตถุใหม่ จะต้องถูกเรียก นี่คือกฎ หากคุณต้องการสร้างวัตถุระดับแม่ใหม่ คุณต้องเรียกวิธีการก่อสร้างของมัน ดังนั้น:
กฎข้อแรก: ในระหว่างกระบวนการสร้างคลาสย่อย ต้องเรียกวิธีการก่อสร้างของคลาสพาเรนต์ สำหรับคลาส ถ้าเราไม่เขียนคอนสตรัคเตอร์ คอมไพเลอร์จะช่วยเราเพิ่มคอนสตรัคเตอร์เริ่มต้น สิ่งที่เรียกว่าคอนสตรัคเตอร์เริ่มต้นคือคอนสตรัคเตอร์ที่ไม่มีพารามิเตอร์ แต่ถ้าคุณเขียนคอนสตรัคเตอร์ด้วยตัวเอง คอมไพเลอร์จะไม่เป็นเช่นนั้น เพิ่มไว้สำหรับคุณ ดังนั้นบางครั้งเมื่อคุณสร้างอ็อบเจ็กต์คลาสย่อยใหม่ จะต้องเรียกตัวสร้างของคลาสย่อย แต่ในตัวสร้างของคลาสย่อย เราไม่ได้เรียกตัวสร้างของคลาสฐานอย่างชัดเจน นั่นคือ ไม่มีการเขียน เช่น: super(); ไม่ได้เขียนแบบนี้ แต่จะเรียก Constructor โดยไม่มีพารามิเตอร์ของคลาสพาเรนต์ หากไม่มี Constructor ที่ไม่มีพารามิเตอร์ในคลาสพาเรนต์ ก็จะเกิดข้อผิดพลาดขึ้น
กฎข้อที่สอง: ถ้าไม่มีการเรียกอย่างชัดเจนไปยังตัวสร้างคลาสฐานในตัวสร้างของคลาสย่อย ระบบจะใช้ค่าเริ่มต้นในการเรียกตัวสร้างแบบไม่มีพารามิเตอร์ของคลาสฐาน หมายเหตุ: ถ้าไม่มีการเรียกที่ชัดเจนไปยังตัวสร้างคลาสฐานใน คอนสตรัคเตอร์ของคลาสย่อย และไม่มีคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์เริ่มต้นในคลาสฐาน จึงเกิดข้อผิดพลาดในการคอมไพล์ ดังนั้น โดยปกติเราจำเป็นต้องแสดง: super (รายการพารามิเตอร์) เพื่อเรียกคอนสตรัคเตอร์ของคลาสหลักพร้อมพารามิเตอร์
//หากคุณกำหนดคอนสตรัคเตอร์ใหม่
สัตว์สาธารณะ (ชื่อสตริง) {
this.name = ชื่อ;
-
-
สุนัขสาธารณะขยายสัตว์{
//ในเวลานี้ คุณต้องเรียก Constructor ของคลาสพาเรนต์อย่างชัดเจน เนื่องจากคลาสย่อยจะเรียกคลาสพาเรนต์ตามค่าเริ่มต้น
//ไม่มีตัวสร้างพารามิเตอร์ Animal()
สุนัขสาธารณะ () {
super("puppy"); //แสดงวิธีคอนสตรัคเตอร์แบบกำหนดพารามิเตอร์ในการเรียกคลาสพาเรนต์
.... // การประมวลผลเมธอดคอนสตรัคเตอร์ของคลาสย่อย
-
-
//แน่นอน หากคุณเขียน Constructor แบบไม่มีพารามิเตอร์อย่างชัดเจนในคลาสพาเรนต์ เช่น:
สัตว์ชั้น{
ชื่อสตริงส่วนตัว
// วิธีการก่อสร้างที่ไม่มีพารามิเตอร์
สัตว์สาธารณะ () {
..... //จัดการด้วย
-
-
หากคุณกำหนด Constructor ใหม่ ในตัว Constructor ของคลาสย่อย คุณสามารถเรียก Constructor ของคลาสพาเรนต์ได้โดยไม่ต้องเรียกมันอย่างชัดเจน เนื่องจากคลาสย่อยมี Constructor ที่ไม่มีพารามิเตอร์
คลาสย่อยจะเรียกคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์ที่กำหนดโดยคลาสพาเรนต์ในตัวคอนสตรัคเตอร์โดยอัตโนมัติ
-
สัตว์สาธารณะ (ชื่อสตริง) {
this.name = ชื่อ;
-
-