บทความนี้อธิบายถึงมรดกของการเขียนโปรแกรมเชิงวัตถุ Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
มรดก: คลาสพิเศษมีคุณสมบัติและพฤติกรรมทั้งหมดของชั้นเรียนทั่วไป
ผลประโยชน์มรดก:
1. การปรับปรุงการใช้ซ้ำของรหัส
2. ให้ชั้นเรียนมีความสัมพันธ์กับชั้นเรียนก่อนและมีเพียงความสัมพันธ์นี้เท่านั้นที่จะมีลักษณะ polymorphic การสืบทอดคือความสัมพันธ์ระหว่างชั้นเรียนและชั้นเรียนก่อน
หมายเหตุ:
1.java รองรับการสืบทอดเดี่ยวเท่านั้นไม่ใช่การสืบทอดหลายครั้ง เนื่องจากการสืบทอดหลายครั้งมีความเสี่ยงด้านความปลอดภัย: เมื่อคลาสแม่หลายตัวกำหนดฟังก์ชั่นเดียวกัน แต่ฟังก์ชั่นแตกต่างกันคลาสย่อยไม่ทราบว่าจะทำงานแบบไหน
2. เมื่อคลาสเด็กสืบทอดคลาสหลักมันจะสืบทอดวิธีการและคุณสมบัติทั้งหมดของคลาสแม่และสามารถใช้โดยตรง
3. Java สนับสนุนมรดกหลายชั้นนั่นคือความสัมพันธ์ระหว่างหลานชาย-พ่อ-พ่อ
ไวยากรณ์:
[class modifier] ชื่อคลาสย่อยของคลาสขยายชื่อคลาสพาเรนต์ {คำสั่ง;}ตัวอย่างเช่น:
คลาส pserson {อายุ int; ชื่อสตริง; โมฆะสาธารณะพูด () {System.out.println ("Hello World!"); }} // สืบทอดคลาสบุคคลสืบทอดวิธีการและคุณลักษณะทั้งหมดของนักเรียนระดับผู้ปกครองขยาย pserson {การศึกษาโมฆะสาธารณะ () {system.out.println ("การศึกษาที่ดี!"); }} // สืบทอดคลาสบุคคลสืบทอดวิธีการและคุณลักษณะทั้งหมดของผู้ปฏิบัติงานระดับผู้ปกครองขยาย pserson {งานโมฆะสาธารณะ () {system.out.println ("ทำงานได้ดี!"); -วิธีใช้ฟังก์ชั่นในระบบสืบทอด (ดูเอกสาร API):
ตรวจสอบฟังก์ชั่นของคลาสพาเรนต์และสร้างวัตถุคลาสย่อยเพื่อใช้ฟังก์ชั่น
สถานการณ์ทั้งสามนี้มักจะพบในระหว่างกระบวนการสืบทอด:
1) ตัวแปรที่มีชื่อเดียวกัน
1. หากคลาสย่อยมีตัวแปรสมาชิกที่ไม่ได้อยู่ในชื่อเดียวกันชื่อย่อยจะเข้าถึงตัวแปรของคลาสนี้และใช้สิ่งนี้ คลาสย่อยเข้าถึงตัวแปรของชื่อเดียวกันในคลาสพาเรนต์และใช้ Super
2. นี่หมายถึงการอ้างอิงถึงวัตถุของคลาสนี้
3.Super แสดงถึงการอ้างอิงไปยังวัตถุคลาสแม่ (การใช้งานเหมือนกับนี้)
2) ฟังก์ชั่นที่มีชื่อเดียวกัน
1. หาก subclass ปรากฏฟังก์ชั่นเหมือนกับคลาสแม่ (ชื่อฟังก์ชันและพารามิเตอร์เหมือนกัน) เมื่อวัตถุ subclass เรียกฟังก์ชั่นฟังก์ชันเนื้อหาฟังก์ชัน subclass จะถูกเรียกใช้ ฟังก์ชั่นของคลาสแม่จะถูกเขียนทับ (เรียกอีกอย่างว่าการเขียนใหม่)
2. เขียนคำจำกัดความใหม่: เมื่อคลาสย่อยสืบทอดคลาสพาเรนต์ให้ติดตามฟังก์ชั่นของคลาสแม่และเข้าสู่คลาสย่อย อย่างไรก็ตามแม้ว่า subclass มีฟังก์ชั่นนี้เนื้อหาของฟังก์ชั่นไม่สอดคล้องกับคลาสแม่ ในเวลานี้ไม่จำเป็นต้องกำหนดฟังก์ชั่นใหม่ แต่ใช้คุณสมบัติการแทนที่รักษานิยามฟังก์ชั่นของคลาสแม่และเขียนเนื้อหาฟังก์ชั่นใหม่
3. หมายเหตุเกี่ยวกับการเขียนซ้ำ (เขียนทับ):
<1> คลาสย่อยแทนที่คลาสแม่ คุณต้องตรวจสอบให้แน่ใจว่าการอนุญาตของชั้นเด็กนั้นสูงกว่าหรือเท่ากับการอนุญาตของคลาสแม่ก่อนการสืบทอดมิฉะนั้นการรวบรวมจะล้มเหลว (สาธารณะ> อย่าเขียนคำหลักวาทศิลป์> ส่วนตัว)
<2> แบบคงที่สามารถครอบคลุมได้เท่านั้น
<3> โอเวอร์โหลด: ดูที่รายการพารามิเตอร์ของฟังก์ชั่นที่มีชื่อเดียวกันและเขียนใหม่: เมธอดคลาสแม่แบบลูกจะต้องเหมือนกัน (ชื่อฟังก์ชันและรายการพารามิเตอร์)
คลาส fu {// โมฆะสาธารณะแสดง () เมื่อคลาสแม่คือแสดง () มันจะเหมือนกับฟังก์ชัน subclass ฟังก์ชั่นการแสดงของคลาสพาเรนต์จะถูกเขียนใหม่โมฆะสาธารณะแสดง (ชื่อสตริง) // ฟังก์ชั่นการแสดงของคลาสแม่แตกต่างจากคลาสย่อย (รายการพารามิเตอร์แตกต่างกัน) ดังนั้นฟังก์ชันการแสดงของคลาสพาเรนต์จะไม่ถูกเขียนใหม่ {system.out.println (ชื่อ); }} คลาส Zi ขยาย fu {public void show () {system.out.println ("zi"); }} คลาส jicheng {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {zi z1 = new zi (); z1.show ("nihao"); // ฟังก์ชั่นการแสดงของคลาสแม่จะถูกเรียกว่า}}3) ตัวสร้าง
1. เมื่อเริ่มต้นวัตถุ subclass ตัวสร้างของคลาสแม่จะทำงานด้วยเช่นกันเนื่องจากบรรทัดแรกของคอนสตรัคเตอร์ของคลาสย่อยมีคำสั่งโดยนัย super () โดยค่าเริ่มต้น
2. super () จะเข้าถึงตัวสร้างของพารามิเตอร์กลวงในคลาสหลักและบรรทัดแรกของตัวสร้างทั้งหมดในคลาสย่อยคือ super () โดยค่าเริ่มต้น
3. เหตุผลที่ทำไมคลาสย่อยจะต้องเข้าถึงตัวสร้างคลาสแม่
<1> เนื่องจากคลาสย่อยข้อมูลในคลาสพาเรนต์สามารถรับได้โดยตรงคลาสย่อยคือการดูก่อนว่าคลาสแม่เริ่มต้นข้อมูล ดังนั้นเมื่อ subclass เริ่มต้นมันจะเข้าถึงตัวสร้างของคลาสแม่โดยค่าเริ่มต้นก่อน
<2> หากคุณต้องการเข้าถึงตัวสร้างที่กำหนดโดยคลาสแม่หรือตัวสร้างที่คลาสแม่ไม่มีพารามิเตอร์ที่ว่างเปล่าคุณสามารถกำหนดได้โดยการกำหนดคำสั่ง Super ด้วยตนเอง
<3> แน่นอนบรรทัดแรกของคอนสตรัคเตอร์ของคลาสย่อยยังสามารถระบุด้วยตนเองเพื่อเข้าถึงคอนสตรัคเตอร์ของคลาสนี้ แต่อย่างน้อยหนึ่งในคอนสตรัคเตอร์ในคลาสย่อยจะเข้าถึงคอนสตรัคเตอร์ของคลาสแม่
คลาส fu {ชื่อสตริง; อายุ int; fu () {system.out.println ("hello fu");} fu (ชื่อสตริง) {system.out.println (ชื่อ); } fu (ชื่อสตริงอายุ int) {this.name = name; this.age = อายุ; System.out.println ("ชื่อ:"+ชื่อ+", อายุ:"+อายุ); }} คลาส zi ขยาย fu {//zi() {system.out.println("hello zi ");} โดยค่าเริ่มต้นตัวสร้างพารามิเตอร์ zi () ของคลาสแม่จะถูกเรียกก่อน Super ("จางซัน", 20); // ใช้คำสั่ง Super ด้วยตนเองเพื่อระบุตัวสร้างของคลาสแม่เพื่อรับข้อมูลที่ไม่ได้อยู่ในเอกชนของระบบคลาสแม่ }} การทดสอบคลาส {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {zi z1 = new zi (); -ตัวอย่างของข้อยกเว้นคอนสตรัคเตอร์:
เขียนผลลัพธ์ของโปรแกรม
คลาส super {int i = 0; Super สาธารณะ (String s) {i = 1; }} การสาธิตคลาสขยาย super {การสาธิตสาธารณะ (สตริง s) {i = 2; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {demo d = การสาธิตใหม่ ("ใช่"); System.out.println (di); }} // การรวบรวมล้มเหลวเนื่องจากตัวสร้างที่มีพารามิเตอร์ว่างหายไปในคลาสหลัก // หรือคลาสย่อยควรระบุตัวสร้างในคลาสหลักที่จะเรียกผ่านคำสั่ง Superเขียนใหม่และเกินพิกัดตัวอย่าง:
การสาธิตคลาส {int show (int a, int b) {return 0;}}ฟังก์ชั่นต่อไปนี้สามารถมีอยู่ในคลาสย่อยของการสาธิต
A.public int show (int a, int b) {return 0;} // ใช่, overwrite
b.private int show (int a, int b) {return 0;} // no, สิทธิ์ไม่เพียงพอ
C.Private int show (int a, long b) {return 0;} // ใช่มันไม่ใช่ฟังก์ชั่นเดียวกับคลาสแม่ ไม่มีความคุ้มครองเทียบเท่ากับการโอเวอร์โหลด
D.Public Short Show (int a, int b) {return 0;} // ไม่เพราะฟังก์ชั่นนี้ไม่สามารถปรากฏในคลาสเดียวกันกับฟังก์ชั่นที่กำหนดหรือในคลาสพาเรนต์เด็ก
E. Static int show (int a, int b) {return 0;} // no, คงที่สามารถเขียนทับคงที่เท่านั้น <br> <br> ดังนั้นคลาสย่อยอนุญาตให้เขียนใหม่และโอเวอร์โหลด
สำหรับเนื้อหาที่เกี่ยวข้องกับ Java ผู้อ่านที่สนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "บทนำและการสอนขั้นสูงเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ Java", "การสอนเกี่ยวกับโครงสร้างข้อมูล Java และอัลกอริทึม" สรุปการดำเนินงานของ Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน