Tôi có mã nàyTại sao thứ tự các khai báo lại quan trọng đối với các trình khởi tạo tĩnh?
private static Set<String> myField;
static {
myField = new HashSet<String>();
myField.add("test");
}
và hoạt động. Nhưng khi tôi lật thứ tự, tôi nhận được tham chiếu về phía trước bất hợp pháp lỗi.
static {
myField = new HashSet<String>();
myField.add("test"); // illegal forward reference
}
private static Set<String> myField;
Tôi hơi bị sốc, tôi không ngờ rằng điều này giống như Java. :)
Điều gì xảy ra ở đây? Tại sao thứ tự khai báo lại quan trọng? Tại sao công việc được giao nhưng không phải là phương thức gọi?
OK, tôi hiểu. Nhưng sau khi gán myField * ban đầu * được khởi tạo. Tại sao tôi vẫn không thể gọi phương thức thêm? –
Nếu ba yêu cầu đó không có, tôi có thể tạo một tham chiếu ngầm định bằng cách sử dụng các biến cục bộ trong bộ khởi tạo, đúng không? Đó có phải là lý do cho những hạn chế này không? –
THLS JLS cho biết: "... Những hạn chế này được thiết kế để bắt, tại thời gian biên dịch, thông tư hoặc theo cách khác không đúng định dạng ...." –