"สวัสดี Amigo! ฉันได้ยิน Rishi อธิบายสิ่งใหม่และน่าตื่นเต้นให้คุณฟัง?!"

“นั่นสินะคิม”

"หัวข้อของฉันจะน่าสนใจไม่น้อย ฉันอยากจะบอกคุณเกี่ยวกับวิธีการโหลดคลาสลงในหน่วยความจำ"

คลาสใน Java คือไฟล์บนดิสก์ที่มี bytecode ซึ่งเป็นโค้ด Java ที่คอมไพล์แล้ว

"ใช่ฉันจำได้."

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

การเริ่มต้นคลาสเกี่ยวข้องกับการกำหนดค่าให้กับตัวแปรสแตติกทั้งหมดและการเรียกบล็อกการเริ่มต้นสแตติกทั้งหมด

"นั่นดูคล้ายกับการเรียกตัวสร้างบนวัตถุ แต่บล็อกการเริ่มต้นแบบคงที่คืออะไร"

"ถ้าคุณต้องการรันโค้ดที่ซับซ้อน (เช่น โหลดบางอย่างจากไฟล์) เพื่อเตรียมใช้งานออบเจกต์ เราสามารถทำได้ในคอนสตรัคเตอร์ อย่างไรก็ตาม ตัวแปรสแตติกไม่มีโอกาสนี้ แต่เนื่องจากความต้องการยังคงอยู่ คุณจึงทำได้ เพิ่มบล็อกหรือบล็อกการเริ่มต้นแบบคงที่ให้กับคลาส โดยพื้นฐานแล้วพวกมันเทียบเท่ากับตัวสร้างแบบคงที่"

นี่คือลักษณะ:

รหัส เกิดอะไรขึ้นจริงๆ
class Cat
{
public static int catCount = 0 ;
public static String namePrefix;

static
{
Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");
}

public static int maxCatCount = 50;

static
{
Properties p = new Properties();
p.loadFromFile("max.properties");
if (p.get("cat-max") != null)
maxCatCount = p.getInt("cat-max");
}

}
class Cat
{
public static int catCount;
public static String namePrefix;
public static int maxCatCount;

//Static constructors aren't allowed in Java,
//but if they were, everything
//would look like this
public static Cat()
{
catCount = 0;

Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");

maxCatCount = 50;

Properties p2 = new Properties();
p2.loadFromFile("max.properties");
if (p2.get("cat-max")!=null)
maxCatCount = p2.getInt("cat-max");
}
}

มันเหมือนกับสิ่งที่เกิดขึ้นเมื่อมีการเรียกคอนสตรัคเตอร์ ฉันได้เขียนมันเป็นตัวสร้างแบบคงที่ (ไม่มีอยู่จริง)

"ครับ ผมเข้าใจแล้ว"

"ดีมาก."