Static Control Flow (ลำดับควบคุม Static)
เมื่อ class ถูกโหลด (class loading) Static members ทำงานตามลำดับ:
- Static variables (field initializers) - ตามลำดับ宣告
- Static initializer blocks - ตามลำดับ宣告
- Static methods - เมื่อถูกเรียก
main method รันทีหลัง static initialization เสร็จสิ้น
ตัวอย่างแสดงลำดับ
public class Demo {
static int a = 97; // 1. Static field initializer
static { // 2. Static block #1
System.out.println("a = " + a); // 97
print(); // เรียก static method
System.out.println("First static block");
}
static void print() {
System.out.println("b = " + b); // b ยังไม่ initialize → 0 (default)
}
static { // 3. Static block #2
System.out.println("Second static block");
}
static int b = 899; // 4. Static field initializer
public static void main(String[] args) { // 5. main method
print();
System.out.println("Main method completed");
}
}
ผลลัพธ์
a = 97 b = 0 First static block Second static block b = 899 Main method completed
คำอธิบาย:
a=97initialize ก่อน → พิมพ์ 97- Static block #1 เรียก
print()→bยังเป็น default 0 - Static block #2 รัน
b=899initializemainเริ่มรัน เรียกprint()อีกครั้ง →bเป็น 899 แล้ว
กฎสำคัญ
- Static variable ใช้ได้ก่อนประกาศ (forward reference) แต่ได้ค่า default (0, null, false)
- Static block ไม่สามารถใช้
this,superหรือ instance members ได้ - ลำดับ: ตามที่เขียนใน source code (top to bottom)