เราได้พูดคุยเกี่ยวกับความจริงที่ว่าคลาสเป็นประเภทข้อมูลที่ซับซ้อน ตอนนี้เรามาพูดถึงอีกด้านของคลาสกันสักหน่อย — วิธีจัดการคลาสโดยเครื่อง Java โปรดจำไว้ว่าใน Java ทุกอย่างเป็นวัตถุแม้แต่คลาส คลาสเป็นวัตถุ นั่นทำให้คุณประหลาดใจไหม? แล้วไปกันต่อ

กำลังโหลดคลาสลงในหน่วยความจำ

ที่จริงแล้ว เมื่อคลาสถูกโหลดลงในหน่วยความจำ จะมีการสร้าง "ออบเจกต์" พิเศษสามรายการ:

กำลังโหลดคลาสลงในหน่วยความจำ

คำอธิบายโดยย่อของภาพประกอบ:

สี่เหลี่ยมผืนผ้าสีเหลือง:

ไฟล์รหัสถูกเก็บไว้ในดิสก์เป็นไฟล์ที่มีนามสกุล ".class" ประกอบด้วยข้อมูลเกี่ยวกับคลาส ฟิลด์และเมธอด รวมถึงซอร์สโค้ดของเมธอดที่คอมไพล์เป็น bytecode

สี่เหลี่ยมผืนผ้าสีส้ม:

เมื่อเครื่อง Java โหลดคลาสลงในหน่วยความจำ เครื่องจะคอมไพล์รหัสไบต์เป็นรหัสเครื่องเฉพาะสำหรับโปรเซสเซอร์และระบบปฏิบัติการของคอมพิวเตอร์ เฉพาะเครื่อง Java เท่านั้นที่สามารถเข้าถึงรหัสเครื่องนี้ได้ ในฐานะโปรแกรมเมอร์ Java เราไม่สามารถเข้าถึงได้

สี่เหลี่ยมผืนผ้าสีเขียว:

เครื่อง Java สร้างวัตถุที่มีตัวแปรและเมธอดคงที่ทั้งหมดของคลาส คุณเข้าถึง "วัตถุ" นี้โดยใช้ชื่อคลาส

ตัวอย่างเช่น เมื่อคุณเขียนคุณกำลังอ้างถึงตัวแปรสแตติกที่อยู่ในคลาส วัตถุนี้ คือสี่เหลี่ยมสีเขียวของเรา และนั่นคือที่เก็บตัวแปร คงที่java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

สี่เหลี่ยมผืนผ้าสีน้ำเงิน:

เมื่อเครื่อง Java โหลดโค้ดของคลาสลงในหน่วยความจำ มันจะสร้างjava.lang.Classออบเจกต์พิเศษซึ่งเก็บข้อมูลเกี่ยวกับคลาสที่โหลด: ชื่อของมัน ชื่อเมธอด ชื่อฟิลด์และประเภท ฯลฯ

ชื่อ "คลาส" อาจทำให้สับสนเล็กน้อย มันจะเหมาะสมกว่าที่จะเรียกมันว่า ClassInfo เนื่องจากคลาสนี้เก็บข้อมูลบางอย่างเกี่ยวกับคลาสที่โหลดเท่านั้น

คุณสามารถรับวัตถุคลาสสำหรับประเภทใดก็ได้โดยใช้คำสั่งดังนี้:

Class name = ClassName.class;

ตัวอย่าง:

รหัส บันทึก
Class a = String.class;
รับClassวัตถุที่มีข้อมูลเกี่ยวกับStringชั้นเรียน
Class b = Object.class;
รับClassวัตถุที่มีข้อมูลเกี่ยวกับObjectชั้นเรียน
Class c = Integer.class;
รับClassวัตถุที่มีข้อมูลเกี่ยวกับIntegerชั้นเรียน
Class d = int.class;
รับClassวัตถุที่มีข้อมูลเกี่ยวกับintประเภท
Class e = void.class;
รับClassวัตถุที่มีข้อมูลเกี่ยวกับvoidประเภท

คุณยังสามารถรับการอ้างอิงถึงออบเจกต์คำอธิบายคลาสจากออบเจ็กต์ใดๆ ก็ได้ เนื่องจากแต่ละอ็อบเจ็กต์มีgetClass()เมธอดที่สืบทอดมาจากObjectคลาส

ตัวอย่าง:

รหัส บันทึก
Class a = "Hello".getClass();
วัตถุเดียวกันกับString.class
Class b = new Integer().getClass();
วัตถุเดียวกันกับInteger.class
Class c = Boolean.TRUE.getClass();
วัตถุเดียวกันกับBoolean.class