2012-04-05 35 views
12

Mã sau đây có phải là trường hợp tham chiếu về phía trước pháp lý không? nếu đúng thì tại sao?Tham chiếu Chuyển tiếp Pháp lý Java

public class MyClass 
{ 
    private static int x = getValue(); 
    private static int y = 5; 
    private static int getValue() 
    { 
    return y; 
    } 
    public static void main(String[] args) 
    { 
    System.out.println(x); 
    } 
} 

Trả lời

19

Mã trên bạn có là hoàn toàn hợp pháp Java. Trong Java, các trường tĩnh được khởi tạo như sau: đầu tiên, tất cả các trường được đặt thành mặc định cho loại của chúng (0, false hoặc null) và sau đó được khởi tạo theo thứ tự chúng được khai báo. Điều này có nghĩa rằng mã trên là bảo đảm để làm như sau:

  1. Set xy bằng không, vì đó là giá trị mặc định cho int s.
  2. Khởi tạo x bằng cách gọi getValue(), giá trị đọc là y. Kể từ y vẫn chưa được khởi tạo, nó vẫn có giá trị 0.
  3. Initialize y đến 5.

Điều này có nghĩa rằng x sẽ mất giá trị 0 và y sẽ mất giá trị 5. Hành vi này được di động và được bảo đảm. You can see this here.

Hy vọng điều này sẽ hữu ích!

+0

Trường hợp nào không phải là biến và phương pháp tĩnh? – Vibhor

+2

Tôi tin rằng hành vi là như nhau - khởi tạo đầu tiên thiết lập mọi thứ về giá trị mặc định, sau đó khởi tạo từng giá trị được chỉ định, sau đó gọi hàm tạo. – templatetypedef

+1

Mà, btw, là một trong những lý do bạn không bao giờ nên gọi một phương thức không cuối cùng (hoặc tư nhân) từ một hàm tạo; quá dễ để ai đó có thể ghi đè phương thức đó và thấy một 'điều này' chưa được xây dựng, thậm chí đến mức nhìn thấy một trường cuối cùng chưa được khởi tạo. – yshavit

5

Bạn có thể biết nó hợp pháp hay không bởi thực tế là nó biên dịch; không giống như một số ngôn ngữ khác, Java không có khái niệm "hành vi không xác định". Điều gì xảy ra ở đây hoàn toàn được viết ra. Nó có thể phản trực giác, nhưng nó đặc biệt hợp pháp: bạn có thể truy cập một biến tĩnh trước khi nó được khởi tạo từ một phương thức được gọi trong khi khởi tạo một biến tĩnh khác. Trường hợp một cách hời hợt tương tự truy cập trực tiếp từ y initializer x 's - ví dụ:

private static int x = y; 
private static int y = 5; 

được đặc biệt không được phép. Có thực sự không có lý do mạnh mẽ tại sao - nó chỉ là như thế nào.

+0

Điều gì sẽ xảy ra nếu các biến không tĩnh ... nhưng hành vi tương tự trong trường hợp đó? – Vibhor

+0

Vâng, nó có hiệu quả giống nhau. Các quy tắc được liệt kê cho các số liệu thống kê rất khác nhau vì không có "các hàm tạo" thực tế cho một lớp, nhưng các đối tượng được khởi tạo theo cách cơ bản giống nhau. Đối với các biến mẫu, các trình khởi tạo và các khối mẫu được thêm vào trước, theo thứ tự xuất hiện, cho mỗi hàm tạo. Đối với các statics, initializers và các khối tĩnh được biên dịch, theo thứ tự, thành một phương thức duy nhất có tên là '() '. –

+0

Có một chương trình có thể được kiểm tra với trình biên dịch là một sự xa xỉ khi nói đến những câu hỏi như thế này tôi sợ.Điều này được lấy từ một kỳ thi giả lập cho kỳ thi OCJP. Tôi đang học nó bây giờ, và đó là những câu hỏi ngu ngốc hoàn toàn vô nghĩa mà làm cho một mockery của ý định cho kỳ thi. –

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