เมื่อโปรแกรม Java กำลังทำงานระบบ Java ได้ดำเนินการระบุประเภทรันไทม์ที่เรียกว่าวัตถุทั้งหมดของวัตถุทั้งหมด RTTI ที่เรียกว่า ข้อมูลนี้บันทึกคลาสของแต่ละวัตถุ เครื่องเสมือนมักใช้วิธีการที่ถูกต้องในการเรียกใช้ข้อมูลประเภทที่จะดำเนินการ คลาสคลาสห่อหุ้มสถานะของวัตถุและอินเทอร์เฟซ
สรุปง่าย ๆ มีดังนี้:
คลาสคลาสยังเป็นคลาสด้วย แต่ชื่อคล้ายกับคำหลักของคลาส Java เป็นภาษาที่ละเอียดอ่อน
เนื้อหาของคลาสคลาสคือข้อมูลประเภทของคลาสที่คุณสร้างขึ้น
วัตถุของคลาสคลาสไม่สามารถสร้างได้ในรูปแบบใหม่ () เช่นคลาสธรรมดาเท่านั้น
บทบาทของคลาสคลาสคือการให้หรือรับข้อมูลประเภทที่ให้หรือรับวัตถุบางอย่างในระหว่างการรันไทม์ซึ่งคล้ายกับฟังก์ชั่น tydeID () ใน C ++ ข้อมูลนี้ยังสามารถใช้สำหรับการสะท้อนกลับ
1. หลักการคลาสคลาส
เราทุกคนรู้ว่าคลาส Java ทั้งหมดสืบทอดคลาส Object ชั้นเรียน เราไม่สามารถสร้างวัตถุคลาส (ตัวสร้างเป็นส่วนตัว) และวัตถุของคลาสนี้คือการสร้างวัตถุคลาสโดยอัตโนมัติโดยเครื่องเสมือน Java เมื่อถูกถ่ายโอนหรือสร้างโดยวิธีการกำหนดในตัวโหลด วัตถุที่เราสร้างจะมีฟิลด์เพื่อบันทึกตำแหน่งของวัตถุของวัตถุในคลาสคลาสของวัตถุ ดังที่แสดงในรูปด้านล่าง:
2. รับวัตถุคลาสคลาส
วิธีแรกคือฟังก์ชัน forname ของคลาสคลาส
[รูปแบบคลาส Codec {}
Class OBJ = class.forName ("รูปร่าง");
วิธีที่สองคือการใช้วัตถุของวัตถุของวัตถุ
โค้ดคัดลอกรหัสดังต่อไปนี้: รูปร่างของคลาส {}
รูปร่าง s1 = รูปร่างใหม่ ();
คลาส obj = s1.getclass ();
Class OBJ1 = S1.GetSuperClass ();
วิธีที่สามคือการใช้ประเภทของประเภทค่าคงที่
โค้ดคัดลอกรหัสดังนี้: obj = string.class;
คลาส obj1 = int.class;
โปรดทราบว่าเมื่อใช้วิธีนี้เพื่อสร้างวัตถุคลาสคลาส JVM จะไม่โหลดคลาสโดยอัตโนมัติ (เช่นสตริง) วิธีอื่น ๆ จะทำให้ JVM เริ่มต้นคลาสนี้
3. ใช้วัตถุของคลาสคลาสเพื่อสร้างอินสแตนซ์ของคลาสเป้าหมาย
อินสแตนซ์วัตถุที่ไม่ถูกต้อง
หลังจากได้รับวัตถุของคลาสคลาสแล้วคุณสามารถใช้ฟังก์ชัน Newinstance () เพื่อสร้างอินสแตนซ์ของคลาสเป้าหมาย อย่างไรก็ตามฟังก์ชั่นนี้ไม่ได้สร้างอินสแตนซ์ของคลาสเป้าหมายโดยตรงและสามารถสร้างอินสแตนซ์ของคลาสวัตถุได้เท่านั้น
โค้ดคัดลอกรหัสดังนี้: obj = class.forName ("รูปร่าง");
Object shapesinstance = obj.newinstance ();
ใช้คลาสทั่วไปเพื่ออ้างอิงอินสแตนซ์เป้าหมายของประเภทเข็มขัดประเภท
รหัสคัดลอกรหัสดังนี้: รูปร่าง> obj = shapes.class;
รูปร่าง newshape = obj.newinstance ();
เนื่องจากข้อ จำกัด ของประเภทการอ้างอิงวัตถุไปยังไวยากรณ์คลาสทั่วไปไม่สามารถนำไปยังหมวดหมู่อื่นได้
โค้ดคัดลอกรหัสดังต่อไปนี้: คลาส OBJ1 = int.class;
คลาส <teger> obj2 = int.class;
obj1 = double.class;
//obj2=double.class; รหัสบรรทัดนี้ผิดกฎหมาย OBJ2 ไม่สามารถเปลี่ยนเป็นหมวดหมู่อื่น ๆ
อย่างไรก็ตามมีการใช้งานที่ยืดหยุ่นซึ่งช่วยให้คุณสามารถชี้ไปที่คลาสย่อยของคลาสฐานที่มีวัตถุในชั้นเรียน
รหัสคัดลอกรหัสดังนี้: คลาส <?
obj = number.class;
obj = double.class;
ดังนั้นวัตถุคลาสที่สร้างขึ้นด้านล่างสามารถชี้ไปที่คลาสใดก็ได้
คัดลอกรหัสรหัสดังนี้: คลาส <?> obj = int.class;
obj = double.class;
obj = shapes.class;
การใช้งานแปลก ๆ ครั้งสุดท้ายคือเมื่อคุณใช้ไวยากรณ์ทั่วไปนี้เพื่อสร้างวัตถุคลาสพื้นฐานของวัตถุในคลาสคลาสที่คุณมีอยู่ในมือคุณต้องใช้ไวยากรณ์พิเศษต่อไปนี้
คัดลอกรหัสโค้ดดังนี้: รูปร่างคลาสสาธารณะ {}
รอบคลาสขยายรูปร่าง {}
คลาส <rand> rclass = round.class;
คลาส <? Super Round> Sclass = rclass.getSuperClass ();
// คลาส <mhapes> sclass = rclass.getsuperclass ();
เรารู้ว่าคลาสพื้นฐานของรอบเป็นรูปร่าง แต่ไม่สามารถประกาศโดยตรงกับชั้นเรียน <shapes> และ ต้องใช้ไวยากรณ์พิเศษ
ชั้นเรียน <?
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้