2013-05-19 32 views
23

Phân tích một số kịch bản lạ ở sau khối tĩnh:java: truy cập vào các biến tĩnh bên trong tĩnh khối

static { 
    System.out.println("Inside Static Block"); 
    i=100; // Compilation Successful , why ? 
    System.out.println(i); // Compilation error "Cannot reference a field before it is defined" 
} 

private static int i=100; 

Trong khi cùng một mã đang làm việc tốt trong khi sử dụng:

static { 
    System.out.println("Inside Static Block"); 
    i=100; // Compilation Successful , why ? 
    System.out.println(MyClass.i); // Compiles OK 
} 

private static int i=100; 

Không chắc chắn tại sao biến khởi tạo không cần truy cập biến bằng cách sử dụng tên lớp trong khi SOP yêu cầu?

+0

ý của bạn là hiển thị lỗi trong cả hai khối? – Bohemian

+1

@Bohemian Tôi nghĩ rằng đây là một bản sao/dán không thành công. Khối thứ hai không hiển thị lỗi. –

+0

cũng xem http://stackoverflow.com/questions/15820302/recursive-initializer-works-when-i-add-this – ZhongYu

Trả lời

10

Điều này là do restrictions on the use of Fields during Initialization. Cụ thể, việc sử dụng các trường tĩnh bên trong một khối khởi tạo tĩnh trước khi dòng được khai báo chỉ có thể ở phía bên trái của một biểu thức (nghĩa là một bài tập), trừ khi chúng đủ điều kiện (trong trường hợp của bạn là MyClass.i).

Ví dụ: nếu bạn chèn int j = i; ngay sau i = 100; bạn sẽ gặp lỗi tương tự.

Cách rõ ràng để giải quyết vấn đề là khai báo static int i;trước khối khởi tạo tĩnh.

+0

+1 Làm mát. Tôi không biết điều đó, cũng như tôi không gặp nó. Ngoài ra tôi không thể tin rằng nó đã đưa tôi dài này để tìm ra tên của bạn:/ – Bohemian

+0

@Bohemian Tôi tự hỏi những gì bạn đã tìm ra. – assylias

+3

Rằng bạn không ngớ ngẩn như bạn có vẻ đầu tiên :) – Bohemian

0

điều này là do trình biên dịch thực hiện phân tích mã tĩnh, ví dụ: phân tích biến trực tiếp (phân tích ngược). Nó tính toán cho mỗi điểm chương trình cho dù biến sẽ được đọc trước khi viết tiếp theo.

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