2013-01-24 15 views

उत्तर

12

यह विशेष रूप से एक संकलन त्रुटि है। और यह वर्ग परिवर्तनीय घोषणाओं के आदेश के बारे में सब कुछ है। के निदर्शी प्रयोजनों के लिए कुछ कोड का उपयोग करते हैं:

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(); 
} 

आप देख सकते हैं, जावा चर की घोषणा आता है, भले ही आप एक वर्ग विधि में एक वर्ग चर संदर्भित करने के लिए अनुमति देता है विधि के बाद । यह एक (कानूनी) आगे संदर्भ का एक उदाहरण है, और इसके लिए समर्थन जावा कंपाइलर में बनाया गया है।

आप हालांकि ऐसा नहीं कर सकते हैं, एक वर्ग चर घोषित है 'एक' है कि एक और वर्ग चर 'बी' कि अभी तक घोषित नहीं किया गया है पर निर्भर करता है। आश्रित वर्ग परिवर्तनीय घोषणाएं उनकी निर्भरता के विपरीत क्रम में दिखाई देनी चाहिए।

एक स्पर्शरेखा पर, अधिकांश, यदि सभी आईडीई आपको चेतावनी नहीं देंगे कि आपके कोड में अवैध संदर्भ त्रुटियां हैं।

अवैध आगे संदर्भ जेएलएस के section 8.3.2.3 में शामिल हैं।

1

सरल शब्दों में इसका मतलब है संदर्भ (एक चर को एक्सेस करना, फ़ंक्शन को कॉल करना) जो कि कोड फ़ाइल में आगे है।

static int x=getY(); 
    static int y=5; 
    static int getY() { return y; } 
  • एक्स के मूल्य Gety()
  • Gety() का परिणाम के लिए निर्धारित है इससे पहले कि y के मूल्य 5
  • एक्स के मान पर सेट है कहा जाता है इसलिए है 0 (डिफ़ॉल्ट पूर्णांक)
  • वाई का मान 5
3

यह मूल रूप से सिर्फ आदेश है कि चीजें संकलक द्वारा पढ़ा जाता है, यदि आप

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

है संकलक ऊपर से नीचे तक इसे पढ़ा होगा, तो यह होगा se पहली पंक्ति है, जो एक चर वाणी ' सी ', और इसे 3 तक असाइन करता है, और यह ठीक है, तो यह दूसरी पंक्ति का सामना करेगा, जो एक चर' ए 'घोषित करता है, और उसके बाद इसे' बी 'असाइन करने का प्रयास करता है।

लेकिन अब, कंपाइलर में कोई समस्या है: यह 'बी' चीज़ क्या है? यह अभी तक 'सी' के बारे में अभी तक सीखा है, और हाल ही में 'ए' है, लेकिन संकलक के बाद से इसे 'बी' नामक कोई जानकारी नहीं है, इसे अभी तक घोषित नहीं किया गया है। तो फिर, चूंकि संकलक सभी भ्रम को संभाल नहीं सकता है, यह बंद हो जाता है, और आपको यह पता लगाने के लिए छोड़ देता है कि आपने इसे क्रोधित करने के लिए क्या किया है।

तो, आगे संदर्भ भाग कुछ ऐसा संदर्भ होगा जो अभी तक मौजूद नहीं है। आगे समय शायद में ..

-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 { 

} 

********* मामले का संदर्भ लें - 1 *********

फॉरवर्ड संदर्भित उदाहरण चर संकलक के रूप में अनुमति नहीं है नहीं है उस मूल्य के प्रकार के बारे में सुनिश्चित करें जिसे हम आगे संदर्भित कर रहे हैं या यह भी संभव हो सकता है कि ऐसा कोई चर मौजूद न हो।

एक उदाहरण पर विचार करें: - आगे संदर्भित उपरोक्त मामले में अनुमति दी है

int a = b; 
boolean b = false; 

तो यह एक तबाही बना सकता है।

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

ऊपर के उदाहरण में मैं ख घोषित करने के लिए है और अब इस तरह का असाइनमेंट जावा द्वारा अनुमति दी गई है, तो यह एक बुरा सपना हो जाएगा नहीं करने का फैसला किया है।

********** मामले का संदर्भ लें - 2 *********

स्थैतिक चर उदाहरण चर से पहले लोड किए गए हैं और इसलिए आगे स्थैतिक चर संदर्भित और उन्हें उदाहरण चर के लिए बताए पूरी तरह ठीक है

संबंधित मुद्दे