มาตรการอย่างเป็นทางการ
คำหลัก "สุดท้าย" ที่จัดทำโดยภาษา Java สามารถใช้ในการทำงานนี้ได้ ดูตัวอย่างซอร์สโค้ดต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
// finaldemo.java
ระดับสุดท้ายของชั้นสุดท้าย FinalDemo {
-
มาสร้างคลาสอื่นด้านล่างซึ่งจะสืบทอดคลาสที่ประกาศไว้ข้างต้น คำหลัก "ขยาย" ที่จัดทำโดยภาษา Java จะช่วยให้ชั้นเรียนได้รับมรดกจากคลาสที่มีอยู่
การคัดลอกรหัสมีดังนี้:
// FinalDemo2.java
ชั้นเรียนสาธารณะ FinalDemo2 ขยาย FinalDemo {
-
หลังจากรวบรวมคลาสแรกถ้าคุณรวบรวมคลาสที่สองคอมไพเลอร์ JDK จะรายงานข้อผิดพลาดและคุณจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
FinalDemo2.java:1: ไม่สามารถสืบทอดได้จาก FinalDemo Final
ชั้นเรียนสาธารณะ FinalDemo2 ขยาย FinalDemo {}
-
1 ข้อผิดพลาด
ตอนนี้คุณได้ป้องกันไม่ให้ชั้นหนึ่งได้รับการสืบทอดโดยชั้นเรียนอื่นด้วยวิธีการอย่างเป็นทางการ
มาตรการที่ไม่เป็นทางการ
อย่างไรก็ตามวิธีการป้องกันไม่ให้ชั้นเรียนได้รับการสืบทอดโดยชั้นเรียนอื่น ๆ นั้นไม่ซ้ำกัน เมื่อพิจารณาถึงรหัสต่อไปนี้ฉันประกาศว่าตัวสร้างเป็นส่วนตัวและยังประกาศวิธีการคงที่เพื่อส่งคืนวัตถุคลาส
การคัดลอกรหัสมีดังนี้:
ชั้นเรียนสาธารณะ Privatetest {
Private PrivateTest () {
System.out.println ("ตัวสร้างเริ่มต้นส่วนตัว");
-
สาธารณะคงที่ privatetest getInstance () {
ส่งคืน Privatetest ใหม่ ();
-
-
รหัสที่แก้ไขข้างต้นเรียกว่า "รูปแบบ Singleton" วิธีการ getInstance จะส่งคืนเพียงหนึ่งอินสแตนซ์เดียวของคลาสนี้ แต่ทำไมรหัสนี้ป้องกันไม่ให้ชั้นเรียนได้รับการสืบทอด? พิจารณารหัสต่อไปนี้คลาสที่ประกาศควรสืบทอดคลาสข้างต้น
ชั้นเรียนสาธารณะ Privatetest2 ขยาย PrivateTest {
-
หลังจากรวบรวมคลาสแรกถ้าคุณรวบรวมคลาสที่สองคอมไพเลอร์ JDK จะรายงานข้อผิดพลาดและคุณจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
Privatetest2.java:1: PrivateTest () มีการเข้าถึงส่วนตัวใน PrivateTest
ชั้นเรียนสาธารณะ Privatetest2 ขยาย PrivateTest {
-
1 ข้อผิดพลาด
คลาสที่สองไม่สามารถสืบทอดคลาสที่หนึ่งได้ แต่ข้อผิดพลาดหมายถึงอะไร? ภาษา Java ต้องการให้มีวิธีการอย่างน้อยหนึ่งองค์ประกอบในชั้นเรียน หากคุณไม่ได้ให้วิธีการใด ๆ สิ่งประดิษฐ์ใด ๆ JDK จะแทรกวิธีการประดิษฐ์เริ่มต้นลงในชั้นเรียนที่คุณประกาศ กล่าวอีกนัยหนึ่งค่าเริ่มต้นคือวิธีการส่วนประกอบที่ไม่มีพารามิเตอร์ตัวองค์ประกอบที่ว่างเปล่าและการอนุญาตการเข้าถึงสาธารณะ อย่างไรก็ตามหากคุณกำหนดวิธีการส่วนประกอบด้วยตัวเองคอมไพเลอร์ JDK จะไม่แทรกวิธีส่วนประกอบเริ่มต้นดังกล่าว เราเพิ่งประกาศวิธีการส่วนประกอบเริ่มต้นในคลาส PrivateTest แต่เราเปลี่ยนการอนุญาตการเข้าถึงสาธารณะเริ่มต้นเป็นการอนุญาตส่วนตัวซึ่งสอดคล้องกับกฎของการตรวจสอบไวยากรณ์ของคอมไพเลอร์ JDK
ทีนี้มาดูแผนกที่สองกันเถอะ ภาษา Java ยังต้องการให้คุณเรียกวิธีการส่วนประกอบของ Super Class บนบรรทัดแรกของวิธีการส่วนประกอบ นี่เป็นสิ่งจำเป็นในการเริ่มต้นคุณสมบัติการสืบทอด ใน Java เราทำภารกิจนี้ให้เสร็จสมบูรณ์โดยเรียกวิธี Super () ซึ่งจะถูกแมปกับวิธีการส่วนประกอบของ superclass หากคุณไม่ได้ให้ตัวสร้างเริ่มต้นสำหรับ SuperClass คอมไพเลอร์ JDK จะแทรกเมธอด superclass เริ่มต้นที่จะโทร
เราเพิ่งประกาศตัวสร้างเป็นการอนุญาตส่วนตัวในชั้นหนึ่ง ตอนนี้เมื่อเราสืบทอดคลาสนี้จากคลาสอื่นคอมไพเลอร์จะพยายามเรียกวิธีการส่วนประกอบซูเปอร์คลาสเริ่มต้น เนื่องจากวิธีการส่วนประกอบภายในขอบเขต superclass จะถูกประกาศว่าเป็นการอนุญาตส่วนตัวคอมไพเลอร์จะรายงานข้อผิดพลาดโดยบอกว่าไม่สามารถเรียกวิธีการส่วนประกอบ superclass ได้ ดังนั้นเราจึงป้องกันไม่ให้คลาสหนึ่งได้รับการสืบทอดโดยคลาสอื่น ๆ ผ่านวิธีการที่ไม่เป็นทางการ
Usman Saleem
มหาวิทยาลัยโมฮัมหมัดอาลีจินนาห์
อีเมล: [email protected]