Đây là trực tiếp từ http://www.programcalet.com/2011/10/java- class-instance -initators /
1. Lệnh thi hành án
Nhìn vào lớp sau, bạn có biết cái nào được thực hiện trước không?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Đầu ra:
khởi tạo tĩnh được gọi là
trình khởi tạo cá thể được gọi là
nhà xây dựng được gọi là
trình khởi tạo cá thể được gọi là
nhà xây dựng được gọi là
2. Trình khởi tạo cá thể Java hoạt động như thế nào?
Trình khởi tạo cá thể ở trên có chứa một câu lệnh println. Để hiểu cách thức hoạt động của nó, chúng ta có thể coi nó như một câu lệnh gán biến, ví dụ : b = 0
. Điều này có thể làm cho nó rõ ràng hơn để hiểu.
Thay vì
int b = 0
, bạn có thể viết
int b;
b = 0;
Do đó, bộ khởi tạo cá thể và bộ khởi tạo biến thể hiện khá giống nhau.
3. Khi nào thì khởi tạo cá thể hữu ích?
Việc sử dụng các trình khởi tạo cá thể rất hiếm, nhưng nó vẫn có thể là một sự thay thế hữu ích cho các trình khởi tạo biến thể hiện nếu:
- Mã khởi tạo phải xử lý các ngoại lệ
- Thực hiện các phép tính không thể biểu thị bằng trình khởi tạo biến thể hiện.
Tất nhiên, mã như vậy có thể được viết trong các nhà xây dựng. Nhưng nếu một lớp có nhiều hàm tạo, bạn sẽ phải lặp lại mã trong mỗi hàm tạo.
Với một trình khởi tạo cá thể, bạn chỉ có thể viết mã một lần và nó sẽ được thực thi bất kể hàm tạo nào được sử dụng để tạo đối tượng. (Tôi đoán đây chỉ là một khái niệm và nó không được sử dụng thường xuyên.)
Một trường hợp khác trong đó các trình khởi tạo cá thể hữu ích là các lớp bên trong ẩn danh, không thể khai báo bất kỳ hàm tạo nào. (Đây có phải là nơi tốt để đặt chức năng ghi nhật ký không?)
Cảm ơn Derhein.
Cũng lưu ý rằng các lớp ẩn danh thực hiện giao diện [1] không có hàm tạo. Do đó, khởi tạo cá thể là cần thiết để thực hiện bất kỳ loại biểu thức nào tại thời điểm xây dựng.
public static void staticMethod(){}
, nếu bạn thực thiTestStatic.class.getMethod("staticMethod");
. Bộ khởi tạo tĩnh sẽ không được gọi. Thêm thông tin ở đây docs.oracle.com/javase/specs/jvms/se10/html/iêu