Initialization Blocks เป็นบล๊อกที่ใช้ในการกำหนดค่าให้กับฟิลด์ในคลาส โดยเราจะประกาศ Initialization Blocks ไว้ก่อนเมธอดคอนสตรัคเตอร์แต่อยู่หลังจากการประกาศฟิลด์

Initialization Blocks แบ่งออกเป็น Static Initialization Blocks และ Instance Initialization Blocks โดย Static Initialization Blocks เอาไว้กำหนดค่าให้กับฟิลด์แบบ static และ ฟิลด์แบบ constant มีรูปแบบดังนี้

static {
    // code
}

ตัวอย่างเช่น

import java.util.Date;

public class StaticInitBlockExample {

    private static String stringField;
    private static Date dateField;

    private static final String A_STRING_CONSTANT;

    static {
        stringField = getEmptyString();
        dateField = new Date();
        A_STRING_CONSTANT = “unknown”;
    }

    private static String getEmptyString() {
        return “empty”;
    }
}

จากตัวอย่างสังเกตุว่าเราประกาศฟิลด์  stringField และ dateField เป็นฟิลด์แบบ static และประกาศ A_STRING_CONSTANT เป็นฟิลด์แบบ constant จากนั้นเราจึงกำหนดค่าให้กับตัวแปรโดยใช้ Static Initialization Blocks แทนที่จะกำหนดโดยตรงตั้งแต่ขั้นตอนการประกาศฟิลด์ หากเรามีการกำหนดค่าให้กับฟิลด์และมีการกำหนดค่าใน Static Initialization Blocks ค่าที่กำหนดให้กับฟิลด์จะถูกแก้ไขโดยค่าที่กำหนดใน Static Initialization Blocks เราสามารถกำหนด Static Initialization Blocks หลายๆบล๊อคได้โดยการทำงานจะเรียงลำดับตามที่เขียนไว้ในโปรแกรม

ส่วน Instance Initialization Blocks ก็เอาไว้กำหนดค่าให้กับฟิลด์ทั่วไป โดยมีรูปแบบ

{
    // code
}

ตัวอย่างเช่น

class InstanceInitBlockExample {

    private int field;

    {
        field = 40;
    }
}

ทั้ง Static Initialization Blocks และ Instance Initialization Blocks จะทำงานก่อนเมธอด constructor เราใช้การกำหนดค่าด้วย Static Initialization Blocks และ Instance Initialization Blocks เมื่อต้องมีการดำเนินการที่ซับซ้อนเพื่อให้ได้ค่ามากำหนดให้กับฟิลด์ ซึ่งเรามักจะไม่เขียนโปรแกรมที่ต้องมีการดำเนินการที่ซับซ้อนไว้ในเมธอดคอนสตรัคเตอร์

ใน Instance Initialization Blocks เราสามารถเรียกใช้ฟิลด์หรือเมธอดที่เป็น static ได้ แต่เราจะไม่สามารถเรียกใช้ฟิลด์หรือเมธอดของออบเจกต์ (instance) ใน Static Initialization Blocks