2013-01-31 31 views
8

thể bất cứ ai giải thích những gì là sai với mã này:bất hợp pháp vấn đề về phía trước Reference java

public class Base { 


    static { 
     i = 1; 
     System.out.println("[Base]after static init block i=" + i);// LINE 1 
     System.out.println("*************************************"); 
     System.out.println(); 
    } 
    static int i; 



    public static void main(String[] args) { 
     System.out.println(Base.i); 
    } 
} 

Nếu tôi nhận xét dòng 1 - mọi thứ đều OK và Base.main phương pháp in "1". Nếu LINE 1 - không được nhận xét, có lỗi biên dịch thời gian: "tham chiếu về phía trước bất hợp pháp". Vì vậy, như tôi hiểu trong khối init tĩnh tôi có thể thiết lập giá trị cho i, nhưng không đọc. Bất cứ ai có thể giải thích lý do tại sao?

Trả lời

14

Điều này là do các 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 dòng mà chú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à Base.i).

Ví dụ: nếu bạn chèn int j = i; ngay sau i = 1; 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.

2

"Tham chiếu về phía trước bất hợp pháp" có nghĩa là bạn đang cố gắng sử dụng biến trước khi được xác định.

Hành vi bạn quan sát là một triệu chứng của lỗi javac (xem báo cáo lỗi này). Sự cố dường như được khắc phục trong các phiên bản trình biên dịch mới hơn, ví dụ: OpenJDK 7.

có một cái nhìn tại

Illegal forward reference error for static final fields

+1

Tôi không nghĩ rằng hành vi như được mô tả trong câu hỏi là lỗi. – assylias

2

Thay đổi mã của bạn để:

int i; 
static { 
    i = 1; 
    System.out.println("[Base]after static init block i=" + i);// LINE 1 
    System.out.println("*************************************"); 
    System.out.println(); 
} 
3

Bạn có thể thêm cơ sở để biến i trong khối tĩnh hoặc bạn phải khai báo static int i trước khi khối. Giải pháp khác là tạo phương pháp tĩnh thay cho khối tĩnh.

static { 
    Base.i = 1; 
    System.out.println("[Base]after static init block i=" + Base.i);// LINE 1 
    System.out.println("*************************************"); 
    System.out.println(); 
} 
+0

+1 điểm tốt .. – assylias

+0

nó đủ để thêm cơ sở chỉ trong tuyên bố System.out, cảm ơn. – Timofei

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