ก่อนอื่นมาดูคำจำกัดความที่กระชับของการโอเวอร์โหลดและการเขียนทับ (การเขียนใหม่):
วิธีการโอเวอร์โหลด: หากสองวิธีมีชื่อวิธีเดียวกัน แต่พารามิเตอร์ไม่สอดคล้องกันดังนั้นวิธีหนึ่งคือวิธีการโอเวอร์โหลดของวิธีอื่น
วิธีการแทนที่: หากมีการกำหนดวิธีการในคลาสย่อยชื่อของมันชื่อประเภทส่งคืนและลายเซ็นพารามิเตอร์ตรงกับชื่อประเภทการส่งคืนและลายเซ็นพารามิเตอร์ของวิธีการในคลาสพาเรนต์อาจกล่าวได้ว่าวิธีการของคลาสย่อยครอบคลุม วิธีการเรียนชั้นเรียน
มามุ่งเน้นไปที่ปัญหาความครอบคลุมโดยใช้รหัสต่อไปนี้เป็นตัวอย่าง:
คนชั้นเรียนสาธารณะ {สตริงสาธารณะ getName () {return "people";}} นักเรียนชั้นเรียนสาธารณะขยายคน {สตริงสาธารณะ getName () {return "นักเรียน"; คนใหม่ (); ผลลัพธ์คือนักเรียน PP = ใหม่นักเรียน ();ผลลัพธ์ข้างต้นแสดงให้เห็นว่าวิธี getName ของชั้นเรียนนักเรียนประสบความสำเร็จในการเขียนทับวิธีการเรียนของผู้ปกครอง
มาดูการซ้อนทับของตัวแปร:
คนชั้นเรียน {Protected String Name = "People"; ออก. println (p.name); // ผลการดำเนินการคือคนนักเรียน s = นักเรียนใหม่ (); System.out .println (pp.name); // ผลการดำเนินการคือคน}จากการเรียกใช้ผลลัพธ์ฉันพบว่าการซ้อนทับของตัวแปรนั้นแตกต่างจากวิธีการ
ในคำพูดของฉันเอง: ความครอบคลุมของตัวแปรสามารถพิจารณาได้ว่าเป็นความคุ้มครองครึ่งการอบมากที่สุดเท่านั้น
มิฉะนั้นการแก้ไขจะไม่เกิดขึ้นหากการสูญเสียข้อมูลเกิดขึ้น
People pp = ใหม่นักเรียน ();
จากประสบการณ์ส่วนตัวของฉัน: ความครอบคลุมของตัวแปรเป็นเรื่องง่ายที่จะทำผิดพลาด มันทำให้ผู้คนรู้สึกว่าพวกเขากลับไปที่มรดกของ C ++ [นี่ไม่ใช่มรดกของ C ++ ด้วยเสมือน]
ในที่สุดลองดูที่รหัสอื่น:
คนชั้นเรียน {Protected String name = "People"; String [] args) {คน p = คนใหม่ (); getName ::::::::::::::::::::::: กระทาน ::::::::::::::::::::::: กระทาน ::::::::::::::::::::::::::::::::::::::::: กระทาน. .println (pp.getName ()); // ผลการดำเนินการคือนักเรียน}เห็นได้ชัดว่าการครอบคลุมดังกล่าวเป็นความครอบคลุมที่มีประโยชน์มากขึ้นสำหรับเราเพราะด้วยวิธีนี้เราสามารถบรรลุวัตถุประสงค์ของการสรุปวัตถุคอนกรีตลงในวัตถุทั่วไปและ polymorphism ที่แท้จริง
ข้างต้นเป็นเพียงความเห็นส่วนตัวของฉัน