2013-05-07 61 views
6

Tôi nhận thấy một cái gì đó trong bộ khởi tạo tĩnh có thể là lỗi trong javac. Tôi đã xây dựng một kịch bản mà tôi có thể gán một biến một giá trị nhưng không đọc lại giá trị đó.Lỗi khởi tạo tĩnh nếu được đặt trước khai báo

Hai ví dụ dưới đây, biên dịch đầu tiên tốt, thứ hai nhận được lỗi khi cố đọc giá trị từ tmp, nhưng vì một số lý do gán giá trị cho tmp được cho phép. Tôi có thể hiểu nếu nó không thể đọc cũng không ghi vào biến kể từ khi tmp được khai báo sau khi initializer tĩnh, nhưng một lỗi trên chỉ có một trong những người không có ý nghĩa với tôi.

//Compiles Successfully: 
public class Script 
{ 
    public static Object tmp; 
    static 
    { 
     tmp = new Object(); 
     System.out.println(tmp); 
    } 

} 

//error only on the read but not the assignment 
public class Script 
{ 

    static 
    { 
     tmp = new Object(); 
     System.out.println(tmp); 
    } 
    public static Object tmp; 
} 

để nhấn mạnh thêm điểm, điều này sẽ biên dịch thành công.

public class Script 
{ 

    static 
    { 
     tmp = new Object(); 
    } 
    public static Object tmp; 
} 
+0

Tôi tin [câu trả lời cho một câu hỏi tương tự] [1] trả lời câu hỏi này tốt hơn tôi có thể. Đó là hành vi kỳ lạ nhưng không phải là lỗi. Nó đang làm những gì nó được cho là phải làm. [1]: http://stackoverflow.com/a/10035928/348975 – emory

+0

Tôi không chắc chắn rằng nó có, khởi tạo tĩnh có để khởi tạo các biến từ giá trị mặc định của chúng. đó là để nói static int v = 1; tương đương với static int v; tĩnh {v = 1;} –

+0

@Dukeling Tôi đã viết bình luận của tôi như là một câu trả lời và StackOverflow xác định câu trả lời của tôi là tầm thường (tôi nghĩ điều đó có nghĩa là quá ngắn) và tự động chuyển đổi nó thành một bình luận, nhưng rõ ràng flubbed các liên kết. – emory

Trả lời

3

Có vẻ như điều này được quy định tại spec (Xem JLS 8.3.2.3):

Việc kê khai của một thành viên cần phải xuất hiện textually trước khi nó được chỉ được sử dụng nếu hội viên là một thể hiện (tương ứng tĩnh) lĩnh vực một lớp hoặc giao diện C và tất cả các điều kiện sau đây giữ:

  • việc sử dụng xảy ra trong một thể hiện (tương ứng tĩnh) vari bộ khởi tạo có thể có của C hoặc trong trình khởi tạo thể hiện (tương ứng tĩnh)
    của C.

  • Cách sử dụng không nằm ở phía bên trái của bài tập.

  • Cách sử dụng là thông qua một tên đơn giản.

  • C là lớp hoặc giao diện trong cùng bao quanh việc sử dụng.

Vì vậy, nếu việc sử dụng là ở phía bên tay trái của một bài tập, sau đó nó là hợp pháp, kể từ khi một giây không giữ nữa.

+0

Ok, tôi mua rằng nó là một phần của đặc điểm kỹ thuật, vẫn còn có vẻ như một điều rất kỳ lạ để chỉ định –

+0

Đôi khi tôi nghĩ Java cần nhiều hơn chỉ là một spec, nhưng cũng là một cuốn sách khác giải thích các quyết định của nó. Tôi hy vọng ai đó có thể làm sáng tỏ điều này, nhưng thông số kỹ thuật là điều tốt nhất tôi có thể tìm ra. –

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