เราได้พูดคุยเกี่ยวกับความจริงที่ว่าคลาสเป็นประเภทข้อมูลที่ซับซ้อน ตอนนี้เรามาพูดถึงอีกด้านของคลาสกันสักหน่อย — วิธีจัดการคลาสโดยเครื่อง Java โปรดจำไว้ว่าใน Java ทุกอย่างเป็นวัตถุแม้แต่คลาส คลาสเป็นวัตถุ นั่นทำให้คุณประหลาดใจไหม? แล้วไปกันต่อ
กำลังโหลดคลาสลงในหน่วยความจำ
ที่จริงแล้ว เมื่อคลาสถูกโหลดลงในหน่วยความจำ จะมีการสร้าง "ออบเจกต์" พิเศษสามรายการ:
คำอธิบายโดยย่อของภาพประกอบ:
สี่เหลี่ยมผืนผ้าสีเหลือง:
ไฟล์รหัสถูกเก็บไว้ในดิสก์เป็นไฟล์ที่มีนามสกุล ".class" ประกอบด้วยข้อมูลเกี่ยวกับคลาส ฟิลด์และเมธอด รวมถึงซอร์สโค้ดของเมธอดที่คอมไพล์เป็น bytecode
สี่เหลี่ยมผืนผ้าสีส้ม:
เมื่อเครื่อง Java โหลดคลาสลงในหน่วยความจำ เครื่องจะคอมไพล์รหัสไบต์เป็นรหัสเครื่องเฉพาะสำหรับโปรเซสเซอร์และระบบปฏิบัติการของคอมพิวเตอร์ เฉพาะเครื่อง Java เท่านั้นที่สามารถเข้าถึงรหัสเครื่องนี้ได้ ในฐานะโปรแกรมเมอร์ Java เราไม่สามารถเข้าถึงได้
สี่เหลี่ยมผืนผ้าสีเขียว:
เครื่อง Java สร้างวัตถุที่มีตัวแปรและเมธอดคงที่ทั้งหมดของคลาส คุณเข้าถึง "วัตถุ" นี้โดยใช้ชื่อคลาส
ตัวอย่างเช่น เมื่อคุณเขียนคุณกำลังอ้างถึงตัวแปรสแตติกที่อยู่ในคลาส วัตถุนี้ คือสี่เหลี่ยมสีเขียวของเรา และนั่นคือที่เก็บตัวแปร คงที่java.lang.Math.PI
PI
java.lang.Math
java.lang.Math
PI
สี่เหลี่ยมผืนผ้าสีน้ำเงิน:
เมื่อเครื่อง Java โหลดโค้ดของคลาสลงในหน่วยความจำ มันจะสร้างjava.lang.Class
ออบเจกต์พิเศษซึ่งเก็บข้อมูลเกี่ยวกับคลาสที่โหลด: ชื่อของมัน ชื่อเมธอด ชื่อฟิลด์และประเภท ฯลฯ
ชื่อ "คลาส" อาจทำให้สับสนเล็กน้อย มันจะเหมาะสมกว่าที่จะเรียกมันว่า ClassInfo เนื่องจากคลาสนี้เก็บข้อมูลบางอย่างเกี่ยวกับคลาสที่โหลดเท่านั้น
คุณสามารถรับวัตถุคลาสสำหรับประเภทใดก็ได้โดยใช้คำสั่งดังนี้:
Class name = ClassName.class;
ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
รับClass วัตถุที่มีข้อมูลเกี่ยวกับString ชั้นเรียน |
|
รับClass วัตถุที่มีข้อมูลเกี่ยวกับObject ชั้นเรียน |
|
รับClass วัตถุที่มีข้อมูลเกี่ยวกับInteger ชั้นเรียน |
|
รับClass วัตถุที่มีข้อมูลเกี่ยวกับint ประเภท |
|
รับClass วัตถุที่มีข้อมูลเกี่ยวกับvoid ประเภท |
คุณยังสามารถรับการอ้างอิงถึงออบเจกต์คำอธิบายคลาสจากออบเจ็กต์ใดๆ ก็ได้ เนื่องจากแต่ละอ็อบเจ็กต์มีgetClass()
เมธอดที่สืบทอดมาจากObject
คลาส
ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
วัตถุเดียวกันกับString.class |
|
วัตถุเดียวกันกับInteger.class |
|
วัตถุเดียวกันกับBoolean.class |
GO TO FULL VERSION