เมื่อสร้างออบเจ็กต์ Non-Static Block (Instance Initializer Block) จะทำงาน ก่อน Constructor ทุกครั้ง
Non-Static Block (Instance Initializer)
- บล็อกระดับคลาส ไม่มีชื่อ/พารามิเตอร์
- รันทุกครั้งที่สร้างออบเจ็กต์ (new) ไม่ว่าจะเรียก Constructor ไหน
- JVM เรียกอัตโนมัติใน Java Stack Area
- สร้างได้หลายบล็อก ทำงานตามลำดับที่ประกาศ (Top-down)
ตัวอย่างโค้ด
public class NonStaticBlockTest {
{
System.out.println("First Non-Static Block"); // 1st block
}
{
System.out.println("Second Non-Static Block"); // 2nd block
}
{
System.out.println("Third Non-Static Block"); // 3rd block
}
NonStaticBlockTest() {
System.out.println("Execution of a Constructor"); // Constructor
}
public static void main(String args[]) {
NonStaticBlockTest nsbt1 = new NonStaticBlockTest();
NonStaticBlockTest nsbt2 = new NonStaticBlockTest();
}
}
ผลลัพธ์
First Non-Static Block
Second Non-Static Block
Third Non-Static Block
Execution of a Constructor
First Non-Static Block
Second Non-Static Block
Third Non-Static Block
Execution of a Constructor
ลำดับการทำงานสมบูรณ์ (Full Initialization Order)
- Static Variables (ตามลำดับ)
- Static Blocks (ตามลำดับ)
- Instance Variables (ตามลำดับ)
- Non-Static Blocks (ตามลำดับ)
- Constructor (body)
Use Cases
- Logic ที่ต้องรันทุกครั้งที่ new Object (Common initialization)
- Anonymous Inner Class ที่ไม่มี Constructor
- Complex initialization ที่ใช้ร่วมหลาย Constructor
Static vs Non-Static Block
| คุณสมบัติ | Static Block | Non-Static Block |
|---|---|---|
| ทำงานเมื่อ | Class Loading (ครั้งเดียว) | Object Creation (ทุกครั้ง) |
| เข้าถึงได้ | Static members เท่านั้น | Static + Instance members |
| this/super | ใช้ไม่ได้ | ใช้ได้ |