ชั้นสุดท้าย
คลาสสุดท้ายไม่สามารถสืบทอดได้ ในเวลาเดียวกันเมื่อคลาสได้รับการแก้ไขด้วยขั้นสุดท้ายหมายความว่าวิธีการทั้งหมดในคลาสสุดท้ายจะถูกระบุโดยปริยายว่าเป็นวิธีสุดท้าย
วิธีสุดท้าย
ในระหว่างกระบวนการสืบทอดคลาสคลาสย่อยไม่สามารถแก้ไขหรือเขียนทับสำหรับวิธีสุดท้ายในคลาสพาเรนต์
วิธีการส่วนตัวทั้งหมดถูกระบุโดยปริยายว่าเป็นวิธีสุดท้าย
มีสองเหตุผลในการใช้วิธีสุดท้าย:
ตัวแปรสุดท้าย
คำหลักสุดท้ายเป็นวิธีที่ใช้กันมากที่สุดในการแก้ไขตัวแปร หากตัวแปรสมาชิกได้รับการแก้ไขจะต้องเริ่มต้นในเวลาของคำจำกัดความหรือในตัวสร้างและไม่สามารถกำหนดได้หลังจากเริ่มต้น
มีความหมายที่แตกต่างกันสำหรับประเภทพื้นฐานและวัตถุคลาส:
ฟิลด์สุดท้ายคงที่เรียกว่าค่าคงที่ระยะเวลาการรวบรวมและโดยทั่วไปจะเป็นตัวพิมพ์ใหญ่
ตัวอย่าง
คลาส glyph {void draw () {system.out.println ("glyph.draw ()"); } glyph () {system.out.println ("glyph () ก่อนวาด ()"); วาด(); System.out.println ("glyph () หลังจาก draw ()"); }} คลาส RoundGlyph ขยาย glyph {ส่วนตัว int redius = 1; RoundGlyph (int r) {radius = r; System.out.println ("RoundGlyph.roundGlyph (), radius =" + radius); } void draw () {system.out.println ("roundglyph.draw (), radius =" + radius); }} คลาสสาธารณะ rolyconstructors {โมฆะคงที่สาธารณะหลัก (String [] args) {ใหม่ RoundGlyph (5); - ผลลัพธ์ผลลัพธ์:
glyph () ก่อนวาด () rumberglyph.draw (), radius = 0glyph () หลังจากการวาด () rumpglyph.roundglyph (), radius = 5
รหัสข้างต้นแสดงกระบวนการเริ่มต้นคลาสและปัญหาภัยพิบัติที่ซ่อนอยู่
ฟังก์ชั่นหลักเรียกตัวสร้าง RoundGlyph ที่มีพารามิเตอร์ 5 เพื่อสร้างวัตถุ RoundGlyph และตัวสร้าง RoundGlyph ของ Glyph คลาสแม่ของมันถูกเรียกก่อนที่ตัวสร้าง RumberGlyph จะถูกดำเนินการ
อย่างไรก็ตามวิธีการวาดถูกเรียกในคอนสตรัคเตอร์ของ Glyph คลาสแม่ เนื่องจาก polymorphism วิธีการวาดของคลาสย่อยเรียกจริง อย่างไรก็ตาม redius ของคลาสย่อยไม่ได้เริ่มต้นผ่านตัวสร้างในเวลานี้ดังนั้นผลลัพธ์คือ:
rubleglyph.draw (), radius = 0
เห็นได้ชัดว่านี่ไม่ใช่ผลลัพธ์ที่เราต้องการดังนั้นจึงเป็นสิ่งสำคัญที่ควรทราบ:
เหตุผลที่สองคือสุดท้ายจะไม่ใช้ polymorphism ดังนั้นจึงสามารถรับประกันได้ว่าวิธีการที่สอดคล้องกันของวัตถุปัจจุบันเรียกว่าแทนที่จะเป็นวิธีการแทนที่ของคลาสย่อยที่ไม่ได้ดำเนินการในงานเริ่มต้น
สรุปวิธีการจัดสรรหน่วยความจำสุดท้าย:
1. ปรับเปลี่ยนตัวแปร:
โดยทั่วไปมีสามสถานที่ที่สามารถกำหนดตัวแปรสุดท้ายได้: การกำหนดโดยตรงในตัวสร้างหรือในบล็อกการเริ่มต้น
(1) การเริ่มต้น:
เนื่องจากการประกาศและการเริ่มต้นเกี่ยวข้องกับไวยากรณ์ Java
กล่าวคือ: หากคุณไม่แสดงตัวแปรการเริ่มต้นระบบจะเริ่มต้นโดยอัตโนมัติด้วยค่าเริ่มต้น (ถ้า int คือ 0)
สำหรับตัวแปรสุดท้ายหากคุณไม่ได้กำหนดค่าเมื่อประกาศระบบเริ่มต้นของฟิลด์ว่างซึ่งเริ่มต้นในตัวสร้าง
หากเป็นแบบคงที่คุณสามารถเริ่มต้นบล็อกได้
(2) หน่วยความจำ:
วิธีการประมวลผลของค่าคงที่ (ตัวแปรสุดท้าย) และตัวแปรที่ไม่ใช่รอบรองชนะเลิศนั้นแตกต่างกัน
เมื่อแต่ละประเภทใช้ค่าคงที่มันจะคัดลอกสำเนาลงในพูลคงที่ของตัวเอง
ค่าคงที่จะถูกเก็บไว้ในพื้นที่วิธีการเช่นตัวแปรคลาส (คงที่) แต่จะถูกเก็บไว้ในสระคงที่
(อาจเป็นตัวแปรคลาสจะถูกแชร์โดยทุกกรณีในขณะที่พูลคงที่ไม่ซ้ำกันในแต่ละอินสแตนซ์)
2. วิธีการปรับเปลี่ยน:
มันถูกบันทึกไว้ในพื้นที่วิธีการและสามารถแทนที่ได้โดยตรงโดยรหัสฟังก์ชั่นโดยไม่ต้องรอจนกว่าจะดำเนินการเพื่อตัดสินใจว่าฟังก์ชั่นใดที่เฉพาะเจาะจง
3. หมวดหมู่การดัดแปลง:
บันทึกในพื้นที่วิธีการ