17

私は 前方参照の合法性についてこの質問forward referencesを経験しましたが、Java言語で何を意味するのかについては明確ではありません。誰かが例の助けを借りて説明できますか?

4

4 に答える 4

16

これは具体的にはコンパイル エラーです。そして、クラス変数宣言の順序付けがすべてです。説明のためにいくつかのコードを使用してみましょう。

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」に依存するクラス変数「a」を宣言することはできません依存クラス変数の宣言は、依存関係の逆の順序で指定する必要があります。

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

不正な前方参照については、JLS のセクション 8.3.2.3で説明されています。

于 2013-01-24T20:25:30.203 に答える
3

基本的には、コンパイラーによって読み取られる順序です。

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

コンパイラはそれを上から下に読み取るので、変数 'c​​' を宣言する最初の行を参照し、それを 3 に割り当てます。 a'、そしてそれを 'b' に割り当てようとします。

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

したがって、前方参照部分は、まだ存在しないものへの参照になります。おそらく時間を進めて..

于 2013-01-24T20:33:27.097 に答える
1

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

   static int x=getY();
   static int y=5;
   static int getY() { return y; }
  • x の値は getY() の結果に設定されます
  • getY() は、y の値が 5 に設定される前に呼び出されます
  • したがって、x の値は 0 (デフォルトの整数) です。
  • y の値は 5
于 2013-01-24T19:53:30.350 に答える