2013-01-24 13 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(); 
} 

あなたが見ることができるように、Javaは、変数の宣言は後の方法来る場合でも、あなたはクラスメソッドに変数クラスを参照することができます。これは(正式な)前方参照の例であり、これに対するサポートはJavaコンパイラに組み込まれています。

あなたはいえないできること、クラス変数を宣言している「」それはまだ宣言されていない別のクラス変数「B」に依存します。従属クラスの変数宣言は、その依存関係の逆の順序で現れなければならない。

コードに不正な参照エラーが含まれている場合、ほとんどの場合、ほとんどのIDEが警告します。

不正な転送参照は、JLSのsection 8.3.2.3に記載されています。

1

簡単に言えば、コードファイルのさらに下にある(変数にアクセスし、関数を呼び出す)ことを意味します。

static int x=getY(); 
    static int y=5; 
    static int getY() { return y; } 
  • Xの値をyの値は5
  • Xの値に設定される前に呼び出されるのgetY()
  • のgetY()の結果に設定され、したがって、0(デフォルトの整数)
  • yの値は5
3

それはあなたが

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

を持っている場合、コンパイラは、上から下にそれを読んでますので、それは変数を宣言SE最初のライン、「意志、基本的なものは、コンパイラによって読み込まれていることを単に順番ですc 'に変換し、それを3に代入すると、それはうまくいきます。次に、変数' a 'を宣言する2行目に遭遇し、次にそれを' b 'に割り当てようとします。

今、コンパイラには問題があります:これは "b"のことですか?コンパイラにはまだ宣言されていないので、 'c'についてはまだ学習していますが、最近では 'a'ですが、 'b'という知識はありません。そうすれば、コンパイラはすべての混乱を処理することができないので、停止し、怒らせるために行ったことを理解することができます。

したがって、前方参照部分はまだ存在しないものへの参照になります。フォワード

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

} 

..おそらく時間で********* CASEを参照してください - 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 

iがBを宣言するために、現在、そのような割り当ては、Javaで許可された場合、それは悪夢であろうないことを決定しました。 2 *********

静的変数は、インスタンス変数の前にロードされ、従って、前方静的変数を参照し、インスタンス変数に割り当てるしている -

********** CASE参照完全に細かいです

関連する問題