2013-03-26 40 views
6
class Z 
{ 
    static final int x=10; 
    static 
    { 
     System.out.println("SIB"); 
    } 

} 
public class Y 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(Z.x); 
    } 
} 

Đầu ra: 10 tại sao khối khởi tạo tĩnh không tải trong trường hợp này ?? khi tĩnh x gọi để tất cả các thành viên tĩnh của lớp z phải được tải ít nhất một lần nhưng khối khởi tạo tĩnh không tải.Tại sao khối khởi tạo tĩnh không chạy trong trường hợp đơn giản này?

+4

trùng lặp: http: // stackoverflow.com/questions/11863800/why-code-in-static-block-does-không-thi hành –

Trả lời

1

Fields mà có modifier tĩnh trong lời tuyên bố của họ được gọi là lĩnh vực tĩnh hoặc biến lớp. Chúng được liên kết với lớp học, thay vì với bất kỳ đối tượng nào. Mỗi phiên bản của lớp đều có một biến lớp , nằm ở một vị trí cố định trong bộ nhớ. Bất kỳ đối tượng có thể thay đổi giá trị của một biến lớp, nhưng các biến lớp cũng có thể được thao tác mà không cần tạo một thể hiện của lớp

Vì vậy, khi bạn gọi Z.x như sau:

System.out.println(Z.x); 

Nó sẽ không khởi tạo lớp, trừ khi bạn gọi số Z.x nó sẽ nhận được rằng x từ vị trí bộ nhớ cố định đó.

Chặn tĩnh được chạy khi JVM tải class Z. Đó là không bao giờ được tải ở đây bởi vì nó có thể truy cập vào đó x trực tiếp mà không cần tải lớp.

0

Nó không chạy vì lớp không bao giờ được tải.

public class Y 
{ 
    public static void main(String[] args) 
    { 
     Z z new Z(); //will load class 
     System.out.println(Z.x); 
    } 
} 

Do trường x trên Z đã được tuyên bố với static final họ được tạo ra ở một vị trí bộ nhớ cố định. Việc truy cập trường này không yêu cầu lớp được tải.

1

biên dịch thời gian Zx giá trị trở thành 10, vì

static final int x=10; is constant 

quá trình biên dịch tạo ra mã như đưa ra dưới đây, sau khi inline

System.out.println(10); //which is not calling Z class at runtime 
+0

+1 Điều này có vẻ là một lý do. Việc xóa từ khóa 'final' sẽ thực thi khối tĩnh. Có thể được tối ưu hóa trình biên dịch kinda. – Apurv

+0

@Apurv: Tất cả điều này được giải thích khá rõ trong bản sao được liên kết với câu hỏi này (http://stackoverflow.com/questions/11863800/why-code-in-static-block-does-not-execute) – NPE

+0

@NPE Xin lỗi , Tôi không đọc những câu trả lời đó. – Apurv

0

Nếu X sẽ không có được cuối cùng, trong trường hợp đó JVM có để tải lớp 'Z' và sau đó chỉ khối tĩnh sẽ được thực thi. Bây giờ JVM không cần tải lớp 'Z' để khối tĩnh không được thực thi.

1

Lý do là khi jvm tải một lớp, nó đặt tất cả các thành viên liên tục của lớp vào vùng không đổi, khi bạn cần chúng, chỉ cần gọi chúng trực tiếp bằng tên lớp, có nghĩa là không cần khởi tạo lớp Z. do đó khối khởi tạo tĩnh không được thực hiện.

0

Hằng số được gọi là hằng số hoàn hảo nếu nó được khai báo là cuối cùng tĩnh. Khi biên dịch biên dịch y học & khi biên dịch sop (Zx), nó thay thế sop (Zx) bằng sop (10) bcz x là một hằng số hoàn hảo có nghĩa là trong mã byte lớp Y không sử dụng lớp Z. Z không tải được tại sao SIB của lớp Z không thực hiện .

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