Một phần trong JLS có thể được tìm thấy: §12.4.2 .
Quy trình khởi tạo chi tiết:
9. Tiếp theo, thực thi các bộ khởi tạo biến lớp và bộ khởi tạo tĩnh của lớp hoặc các bộ khởi tạo trường của giao diện, theo thứ tự văn bản, như thể chúng là một khối duy nhất, ngoại trừ các biến lớp cuối cùng và các trường của giao diện có giá trị được biên dịch hằng số thời gian được khởi tạo đầu tiên
Vì vậy, ba biến tĩnh sẽ được khởi tạo lần lượt theo thứ tự văn bản.
Vì thế
static A obj = new A();
//num1 = 1, num2 = 1;
static int num1;
//this is initilized first, see below.
static int num2=0;
//num1 = 1, num2 = 0;
Nếu tôi thay đổi thứ tự thành:
static int num1;
static int num2=0;
static A obj = new A();
Kết quả sẽ là 1,1
.
Lưu ý rằng static int num1;
không phải là một bộ khởi tạo biến vì ( §8.3.2 ):
Nếu bộ khai báo trường chứa bộ khởi tạo biến thì nó có ngữ nghĩa của một phép gán (§15.26) cho biến đã khai báo và: Nếu bộ khai báo dành cho một biến lớp (tức là trường tĩnh), thì bộ khởi tạo biến đó là đã đánh giá và bài tập được thực hiện chính xác một lần, khi lớp được khởi tạo
Và biến lớp này được khởi tạo khi lớp được tạo. Điều này xảy ra đầu tiên ( §4.12.5 ).
Mọi biến trong chương trình phải có một giá trị trước khi giá trị của nó được sử dụng: Mỗi biến lớp, biến thể hiện hoặc thành phần mảng được khởi tạo với giá trị mặc định khi nó được tạo (§15.9, §15.10): Đối với kiểu byte, giá trị mặc định là 0, tức là giá trị của (byte) 0. Đối với kiểu short, giá trị mặc định là 0, nghĩa là giá trị (short) 0. Đối với kiểu int, giá trị mặc định là 0, nghĩa là 0. Đối với kiểu long, giá trị mặc định là 0, nghĩa là 0L. Đối với kiểu float, giá trị mặc định là số 0 dương, nghĩa là 0,0f. Đối với loại double, giá trị mặc định là số không dương, nghĩa là 0,0 ngày. Đối với kiểu char, giá trị mặc định là ký tự rỗng, nghĩa là '\ u0000'. Đối với kiểu boolean, giá trị mặc định là false. Đối với tất cả các kiểu tham chiếu (§4.3), giá trị mặc định là null.