2013-01-24 32 views

Trả lời

12

Đây là lỗi biên dịch cụ thể. Và tất cả về việc sắp xếp các khai báo biến lớp. Hãy sử dụng một số mã cho mục đích minh họa:

public class ForwardReference {   
    public ForwardReference() { 
     super(); 
    } 

    public ForwardReference echoReference() { 
     return this; 
    } 

    public void testLegalForwardReference() { 
     // Illustration: Legal 
     this.x = 5; 
    } 

    private int x = 0; 

    // Illustration: Illegal 
    private ForwardReference b = a.reference(); 
    private ForwardReference a = new ForwardReference(); 
} 

Như bạn thấy, Java cho phép bạn tham khảo một lớp biến trong một phương pháp lớp, thậm chí nếu việc khai báo của biến đến sau phương pháp . Đây là một ví dụ về tham chiếu chuyển tiếp (hợp pháp) và hỗ trợ cho việc này được xây dựng trong trình biên dịch Java.

gì bạn không có thể làm, mặc dù là khai báo một biến lớp 'a' mà phụ thuộc vào một lớp biến 'b' mà chưa được công bố được nêu ra. Các khai báo biến lớp phụ thuộc phải xuất hiện theo thứ tự ngược lại của sự phụ thuộc của chúng.

Trên tang, Hầu hết, nếu không phải tất cả IDE sẽ cảnh báo bạn nếu mã của bạn chứa lỗi tham chiếu bất hợp pháp.

Tham chiếu chuyển tiếp bất hợp pháp được bao gồm trong section 8.3.2.3 của JLS.

1

Trong thuật ngữ đơn giản, nó có nghĩa là tham chiếu (truy cập một biến, gọi hàm) nằm sâu hơn trong tệp mã.

static int x=getY(); 
    static int y=5; 
    static int getY() { return y; } 
do đó
  • giá trị x được đặt thành kết quả của GetY()
  • GetY() được gọi trước khi giá trị y được thiết lập để giá trị 5
  • x là 0 (mặc định số nguyên)
  • Giá trị của y là 5
3

Đó là về cơ bản chỉ là thứ tự mà mọi thứ được đọc bởi trình biên dịch, nếu bạn có

int c = 3 
int a = b; 
int b = 5; 

trình biên dịch sẽ đọc nó từ trên xuống dưới, vì vậy nó sẽ se dòng đầu tiên, trong đó khai báo một biến ' c ', và gán nó cho 3, và đó là tốt, sau đó nó sẽ gặp phải dòng thứ hai, mà tuyên bố một biến' a ', và sau đó cố gắng để gán nó vào' b '.

Nhưng bây giờ, trình biên dịch có vấn đề: Điều 'b' này là gì? Nó chỉ mới biết về 'c', và gần đây là 'a', nhưng nó không có kiến ​​thức gì được gọi là 'b', vì trình biên dịch, nó chưa được khai báo. Vì vậy, kể từ khi trình biên dịch không thể xử lý tất cả sự nhầm lẫn, nó dừng lại, và lá bạn để tìm những gì bạn đã làm để tức giận nó.

Vì vậy, phần tham chiếu chuyển tiếp sẽ là tham chiếu đến nội dung chưa tồn tại. Chuyển tiếp trong thời gian có lẽ ..

-1
public class AnyCode { 

    void print() { 
     System.out.println("Value of j - " + j); // legal 
     System.out.println("Value of i - " + i); // legal 
    } 

    // CASE - 1 
    int k = i;   // illegal 
    int i; 

    // CASE - 2 
    int l = j;   // legal 
    static int m = j; // illegal 
    static int j; 

    // CASE - 3 
    A aObj = bObj;  // illegal 
    B bObj = new B(); 

    public static void main(String[] args) { 

     /* 
      Note :- here anyCode act as a local variable and get space on stack 
      whereas the object it is referring to is present on heap. And you 
      cannot forward reference a local variable. 
     */ 

     anyCode.print(); // 'Cannot find symbol' error 
     AnyCode anyCode = new AnyCode(); 
    } 

} 

class A { 

} 

class B { 

} 

********* Tham khảo CASE - 1 *********

Forward tham khảo biến dụ không được phép như trình biên dịch không phải là chắc chắn về loại giá trị mà chúng tôi đang chuyển tiếp tham chiếu hoặc thậm chí có thể là không có biến nào tồn tại.

Hãy xem xét một ví dụ: -

int a = b; 
boolean b = false; 

Nếu tham khảo về phía trước được cho phép trong trường hợp trên thì nó có thể tạo ra một sự tàn phá.

int a = b; // What is b? is it a primitive variable or a value or a object reference 

trong ví dụ trên tôi đã quyết định không khai báo b và bây giờ nếu việc chuyển nhượng đó được java cho phép thì đó sẽ là một cơn ác mộng.

********** Tham khảo CASE - 2 *********

biến tĩnh được nạp trước khi biến dụ và do đó mong tham chiếu các biến tĩnh và gán chúng cho instance variable là hoàn toàn tốt đẹp

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