3

テストケースを見てみましょう:

public class StaticFieldTest {
    public  static  int A= 1;
    static {
        A=2;
        NAME="AAA";
        //  System.out.println(NAME);  // Can't forward reference
    }
    public  static  String NAME = "Archer";

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

出力はArcherです。NAME="AAA"退屈であることは明らかです。Java がこの種の書き込みを許可するのはなぜですか?

4

2 に答える 2

0

初期化の順序を理解する必要があります

静的初期化子とクラス変数初期化子は、テキスト順に実行されます。あなたの例では、静的ブロックは静的変数の割り当てに先行します。順番が入れ替わると答えが違ってきます。

クラスがインスタンス化される (オブジェクトが作成される) と、インスタンス変数が初期化され、次にコンストラクターが呼び出されます。

于 2012-07-04T15:55:50.303 に答える
0

彼らのJava言語仕様は、これが「コンパイル時に、循環またはその他の不正な形式の初期化をキャッチするために」配置されていることを示唆しています。

NAME = AAA;あなたがコンパイル可能である理由NAMEは、ステートメントの左側にあります。


8.3.2.3. 初期化中のフィールドの使用に関する制限

メンバーの宣言は、メンバーがクラスまたはインターフェイス C のインスタンス (それぞれ静的) フィールドであり、次のすべての条件が保持される場合にのみ、使用する前にテキストで表示する必要があります。

  • 使用は、C のインスタンス (それぞれ静的) 変数初期化子または C のインスタンス (それぞれ静的) 初期化子で発生します。

  • 使用法は割り当ての左側にありません。

  • 使い方は単純な名前です。

  • C は、使用法を囲む最も内側のクラスまたはインターフェイスです。

于 2012-07-04T16:22:52.427 に答える