2013-03-15 26 views
9

Một trong những người bạn của tôi đã hỏi tôi rằng sẽ tải biến tĩnh hoặc khối tĩnh đầu tiên.Loại nào sẽ được tải biến tĩnh hoặc khối tĩnh đầu tiên?

Điểm trả lời của tôi cho biến tĩnh.

Vì vậy, ông đã cho tôi hai phương trình và cho biết để phân biệt giữa chúng
Đầu tiên Equation

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
} 

O/P: 0 90

Second Equation

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
    static { 
     System.out.println(Some.x); 
    } 
} 

O/P: 90 90

Tôi đã cố gắng dịch ngược mã byte và thấy nó giống nhau cho cả hai phương trình trên. Hãy giúp tôi phân biệt giữa chúng. Tôi bối rối khi biến tĩnh sẽ được khởi tạo.

+3

Nội dung tĩnh được thực thi tuần tự, theo thứ tự được xác định trong lớp. –

+0

Bạn có chắc chắn mã byte giống nhau không? Tôi đã mong đợi các tờ khai xuất hiện theo một thứ tự khác, và như @Sudhanshu chỉ ra, thứ tự khai báo có ý nghĩa. –

+0

@PatriciaShanahan ya cho cả hai mã byte phương trình là giống nhau. – Hablu

Trả lời

1

biến tĩnh và khối tĩnh được thực thi theo thứ tự xuất hiện.

đây đầu tiên O/P: 0 90 như trong báo cáo kết quả System.out.println(Some.x); của khối tĩnh thực hiện sau khi tuyên bố khởi biến tĩnh static int x=90;

+0

Rác. Gấp liên tục được thực hiện bởi trình biên dịch, chứ không phải JVM. JVM thực thi các biến khởi tạo và các biến khối tĩnh theo thứ tự văn bản mà chúng xuất hiện trong tệp nguồn. Không phải biến trước và sau đó là các khối. – EJP

+0

Đã chỉnh sửa, xin lỗi vì sự bất tiện và cảm ơn. –

-1

biến tĩnh được thực hiện khi JVM tải Class, và các lớp được nạp khi nó được khởi tạo hoặc phương thức tĩnh của nó đang được gọi.

Khối khởi tạo tĩnh được khởi tạo trước khi lớp được khởi tạo hoặc trước khi phương thức tĩnh của nó được gọi và thậm chí trước khi biến tĩnh của nó được sử dụng.

-1

Tôi đưa ra một ví dụ đơn giản cho dòng điều khiển của tĩnh và dụ các chất liệu:

Giả sử bạn có 2 clases A và B. lớp Một kéo dài đến lớp B. và lớp B có một phương pháp chính.Sau khi biên dịch thành công của cả hai lệnh trên cmd giống như:

java B 

Bây giờ những gì sẽ xảy ra thấy từng bước:

  1. lớp A và B sẽ được nạp
  2. thành viên tĩnh và các khối lớp A sẽ được xác định và sẽ là được thực hiện tuần tự (từng lần một) (Nhưng chỉ một lần tại thời điểm tải lớp)
  3. thành viên tĩnh và khối lớp B sẽ được xác định và thực hiện (từng người một) tại thời điểm lớp học đang tải)
  4. phương pháp chính của lớp B sẽ được gọi (Trong trường hợp lớp B không có phương pháp chính thì phương thức chính của lớp A sẽ được gọi)
  5. Ngay khi bạn tạo đối tượng lớp A: tất cả Ví dụ thành viên khởi tạo và khối thi dụ sẽ được thực hiện trong hạng A
  6. constructor của lớp A (mà bạn sử dụng để tạo đối tượng) sẽ được thực hiện
  7. Nếu bạn tạo một đối tượng của lớp B: tất cả các ví dụ khởi tạo thành viên và thực thi khối mẫu sẽ được thực hiện trong lớp A.
  8. constructor của lớp A (constructor mặc định hoặc bất kỳ khác nếu bạn gọi nó là từ constructor B) sẽ được thực hiện

  9. sau đó tất cả các ví dụ thành viên khởi tạo và khối thi dụ sẽ được thực hiện trong lớp B

  10. và sau đó các nhà xây dựng của lớp B (mà bạn sử dụng cho tạo đối tượng) sẽ được thực hiện

Lưu ý: các thành viên tĩnh và khối thi chỉ được thực hiện một lần trong khi tải lớp lần đầu tiên, trong khi các thành viên instance và các khối mẫu được thực hiện mỗi khi chúng ta tạo một đối tượng của lớp đó. Vui lòng cho tôi biết nếu tôi không chính xác.

+0

'Lớp A mở rộng đến lớp B' không rõ ràng ở mức tốt nhất, hoặc vô nghĩa lúc tồi tệ nhất. Nếu bạn có nghĩa là A mở rộng B hầu hết câu trả lời của bạn là sai. – EJP

+0

Không thể giúp bạn, hãy giải thích quan điểm của bạn. –

+0

Tôi không nghĩ là mình có thể. Nó đã có vẻ hoàn toàn rõ ràng với tôi. Bạn cần phải làm rõ tuyên bố tôi đã trích dẫn. – EJP