Block này gọi là Initializing Instance Members, ngoài ra còn có final method và constructor. Cả 3 đều có nhiệm vụ khởi tạo (initialize) các instance variables của class.
{
System.out.println(1);
}
Về thứ tự: final method -> initializing block member -> constructor
class Person {
// use final method
private String name = setupName();
// Initializing Block Member
{
System.out.println("in initializing block member");
}
// Constructor
public Person() {
System.out.println("in person constructor");
}
protected final String setupName() {
System.out.println("in final method setupName()");
return "Drgnz";
}
public String getName() {
return name;
}
}
public class TestPerson {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.getName());
}
}
Output
in final method setupName()
in initializing block member
in person constructor
Drgnz
Với static variables, thứ tự: final method -> static block initializer
Trở lại ví dụ của bạn.
Sau khi qua bước parsing, sinh được bytecode bằng javac, java runtime đọc từ trên xuống dưới mã nguồn (thực chất là đọc bytecode, 1 biểu diễn khác của Java code).
- java đọc enum, khởi tạo enum, bắt đầu từ instance variables, sau đó sang static variables.
- Bước instance variables, java thấy A, init cho A, chạy block member, in ra 1, sau đó chạy tiếp constructor, in ra 3.
- Tương tự cho B, C, in ra các giá trị lần lượt 1, 3, 1, 3. Kết thúc instance variables initialization.
- Chuyển sang static variables, java đọc tiếp static block initializer
static { ... }, chạy block để khởi tạo static members, in ra 2.