Giả sử bạn có
static class Foo
{
static Bar bar = new Bar();
static int func(){ ... }
}
rõ ràng, một đối tượng Foo
sẽ không được tạo ra để gọi func()
.
Tuy nhiên, lớp học Foo
cần được tải trong bộ nhớ; và đối với ứng dụng, có một đối tượng tương ứng với lớp, có thể được gọi là Foo.class
hoặc Class.forName("Foo")
.
Lớp đã tải chưa được khởi tạo. Khi bạn gọi một phương thức tĩnh lần đầu tiên, lớp được khởi tạo; một số "khoảng trống" được phân bổ cho các biến tĩnh và mã khởi tạo tĩnh (như new Bar()
) được thực thi.
"Không gian" này không hiển thị đối với ứng dụng dưới dạng đối tượng; nhưng cấu trúc dữ liệu bộ nhớ cũng liên quan đến các bộ sưu tập rác (và các đối tượng khác mà nó đề cập đến, chẳng hạn như bar
)
Lớp này và "không gian", chỉ đủ điều kiện cho GC khi trình nạp lớp đã nạp đủ điều kiện cho GC. Đối với các ứng dụng dòng lệnh thông thường, điều đó không bao giờ xảy ra. Nhưng đối với rất nhiều ứng dụng khác, lớp GC là quan trọng và việc tải lớp cần được thực hiện một cách cẩn thận.
Bạn đang nhầm lẫn khi tải lớp (tạo các đối tượng 'Lớp' và siêu dữ liệu cụ thể của VM) với sự kiện đối tượng. (Lưu ý rằng các lớp trừu tượng có thể có các phương thức tĩnh - không thể có sự khởi tạo tự động ẩn nào.) –