2011-12-18 24 views
13

Người ta nói rằng các khối tĩnh trong java chỉ chạy một lần khi lớp đó được nạp. Nhưng nó thực sự có ý nghĩa gì? Tại thời điểm nào là một lớp được nạp bởi JVM (Java Virtual Machine)?"Khi nào một Lớp được tải" thực sự có nghĩa là gì?

Có phải khi phương pháp chính trong lớp đó được gọi? Và có phải tất cả các lớp siêu của cùng một lớp cũng được nạp khi phương thức chính bắt đầu thực hiện?

Hãy xem xét A mở rộng B và B mở rộng C. Tất cả đều có các khối tĩnh. Nếu A có phương pháp chính, thì chuỗi thứ tự thực hiện các khối tĩnh là gì?

Trả lời

9

Điều này được mô tả trong phần Execution của JLS. Cụ thể:

Khởi tạo lớp học bao gồm thực thi trình khởi tạo tĩnh và trình khởi tạo cho trường tĩnh được khai báo trong lớp. Việc khởi tạo một giao diện bao gồm việc thực hiện khởi tạo cho các trường được khai báo trong giao diện.
Trước khi một lớp được khởi tạo, lớp cha trực tiếp của nó phải được khởi tạo, nhưng các giao diện do lớp thực hiện không cần phải được khởi tạo. Tương tự, các siêu kết nối của một giao diện không cần phải được khởi tạo trước khi giao diện được khởi tạo.

Vì vậy, trong ví dụ của bạn, khối tĩnh của lớp "trên cùng" (C) chạy đầu tiên, sau đó là của B, thì một phần lớn có nguồn gốc từ.

Xem tài liệu đó để biết mô tả chi tiết về tất cả các bước đi vào tải lớp học.

(. Các lớp được nạp khi họ lần đầu tiên được chủ động sử dụng)

1

Từ Java Language Specification:

Khởi tạo của một lớp bao gồm thực hiện initializers tĩnh của nó và initializers cho các lĩnh vực tĩnh (các biến lớp) tuyên bố trong lớp. Việc khởi tạo một giao diện bao gồm việc thực hiện khởi tạo cho các trường (hằng số) được khai báo ở đó.

Trước khi một lớp được khởi tạo, lớp cha của nó phải được khởi tạo, nhưng giao diện được lớp thực hiện không được khởi tạo. Tương tự, các siêu kết nối của giao diện không được khởi tạo trước khi giao diện được khởi tạo.

Quy trình được mô tả chi tiết hơn trong Java Virtual Machine Specification.

1

Tôi nghĩ rằng ví dụ sau đây sẽ giải quyết tất cả các vấn đề của bạn:

Trước khi một lớp được khởi tạo, superclasses của nó được khởi tạo, nếu họ trước đây chưa được khởi tạo.

Như vậy, chương trình thử nghiệm:

class Super { 
     static { System.out.print("Super "); } 
} 
class One { 
     static { System.out.print("One "); } 
} 
class Two extends Super { 
     static { System.out.print("Two "); } 
} 
class Test { 
     public static void main(String[] args) { 
       One o = null; 
       Two t = new Two(); 
       System.out.println((Object)o == (Object)t); 
     } 
} 

in:

Super Two false 

Lớp Một bao giờ được khởi tạo, bởi vì nó sử dụng không tích cực, do đó không bao giờ được liên kết đến.Lớp hai được khởi tạo chỉ sau khi siêu lớp Super của nó đã được khởi tạo.

Để biết thêm chi tiết chuyến thăm này link

Chỉnh sửa chi tiết: dòng khó hiểu Removed.

+0

'Ngay sau khi JVM khởi động' không phải là mô tả chính xác về quy trình này. Xem các câu trả lời khác. Downvote. – EJP

+0

Đòi lại những đường khó hiểu –

Các vấn đề liên quan