Để cho bày tỏ với một ví dụ rõ ràng hơn:
public class Test {
static {
System.out.println("static initializer");
}
{
System.out.println("instance initializer");
}
public Test() {
System.out.println("constructor");
}
}
và thử nghiệm nó như sau:
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
đầu ra:
static initializer
instance initializer
constructor
instance initializer
constructor
Các initializers tĩnh được thực hiện chỉ lần trong thời gian chạy, đặc biệt trong khi tải lớp. Các trình khởi tạo thể hiện được thực thi trong mọi instantiation trước constructor.
Bạn có thể có nhiều hơn một trong số chúng và chúng sẽ được thực hiện theo thứ tự khi chúng xuất hiện trong mã hóa.
Lợi ích chính của trình khởi tạo mẫu là chúng được thực hiện bất kể bạn tạo hàm tạo nào. Chúng áp dụng cho mỗi người trong số họ để bạn không cần phải lặp lại việc khởi tạo chung trên tất cả chúng.
Lợi ích chính của bộ khởi tạo tĩnh là chúng chỉ được thực thi một lần trong khi tải lớp. Một ví dụ thực tế nổi tiếng là trình điều khiển JDBC. Khi bạn làm
Class.forName("com.example.jdbc.Driver");
mà chỉ thực thi static
initializers, sau đó bất kỳ (đàng hoàng) điều khiển JDBC sẽ tự đăng ký trong DriverManager
như sau
static {
DriverManager.registerDriver(new com.example.jdbc.Driver());
}
cách này DriverManager
có thể tìm thấy các trình điều khiển JDBC ngay trong getConnection()
.
Vì vậy, từ khóa tĩnh là tùy chọn? – blackanchorage
vì vậy nếu tạo một khối tĩnh trong mã trên, mà sẽ chạy đầu tiên các khối tĩnh hoặc khối khởi tạo tĩnh? .... u có thể giải thích những gì là initializer tĩnh? – Hariharbalaji
Nó chắc chắn KHÔNG phải là bộ khởi tạo 'tĩnh'. – BalusC