6
public class TestLab {

    static Test aStatic=new Test();
    public static void main(String[] args) {

        TestLab obj=new TestLab();
    }
    static{
        System.out.println("In static block of TestLab");
          }

}


public class Test {


    static Test ref=new Test();
    Test()
    {
        System.out.println("Default Constructor of Test");
    }
    static
    {
        System.out.println("In Static Block of Test");
    }
    {
         System.out.println("In instance block of Test");
    }

}

通常、静的ブロックはクラスのロード中に最初に実行されます。上記の例を実行すると、次の出力が表示されます。

Test のインスタンスブロック内

テストのデフォルト コンストラクタ

テストの静的ブロック内

Test のインスタンスブロック内

テストのデフォルト コンストラクタ

TestLab の static ブロック内

テストクラスのインスタンスブロックとデフォルトコンストラクタがテストクラスの静的ブロックの前に実行されるのはなぜですか?

4

3 に答える 3

8

Ok。staticフィールド/ブロックは、クラスの初期化中に設定/実行されます。これらは、コードに表示される順序で実行されます。したがって、クラスTestLabがロードされた後、初期化されると、次のことが起こります。

  1. static Test aStatic=new Test();==> class の初期化の一部として呼び出されTestLabます。ここから、Testクラスが参照されます。したがって、コントロールはTestクラスに移動します。

  2. static Test ref=new Test();==> つまり、Test クラスの最初の行 (初期化フェーズ中) が実行されます。この行には の新しいインスタンスの作成が含まTestれるため、制御は のインスタンス ブロック ( Test の In instance ブロック) に移動しTest、次にコンストラクター ( Test の Default Constructor ) に移動します。

  3. これstatic Test ref=new Test();で完了なので、 のクラスの初期化がTest続行され、 static ブロック ( Test の In Static Block ) に到達します。これで の初期化は完了ですTest

  4. 制御が に戻りTestLabnew Test()が呼び出されました。したがって、再びIn instance ブロックの TestDefault Constructor of Testが出力されます (クラスは既に初期化されているため、staticフィールドは再度初期化されず、静的ブロックは実行されません)。

  5. コントロールはTestLab( TestLab の静的ブロック内) の静的ブロックに到達します。

于 2015-09-24T05:51:37.923 に答える
1

型が初期化されると、すべての静的初期化子とすべての静的フィールド初期化子がテキスト順に実行されます。JLS 12.4.2から:

次に、クラスのクラス変数初期化子と静的初期化子、またはインターフェイスのフィールド初期化子を、単一のブロックであるかのように、テキストの順序で実行します。

つまり、次のコードが実行されます。

ref = new Test();
System.out.println("In Static Block of Test");

その最初の行はインスタンスを作成します...これには、インスタンス初期化子を実行する必要があります。そのインスタンスの初期化はすべて、制御が型の初期化部分に戻る前、つまり静的初期化子の行が実行される前に行われます。

フィールド宣言を静的初期化子のに移動すると、反対の結果が表示されます。

于 2015-09-24T05:49:54.940 に答える
0

通常、定義されている順序で初期化されます。ここではとしてstatic variables/blocksマークしています。コンストラクターを呼び出して Test のインスタンスを作成しようとしますが、インスタンス ブロックが提供されると、それが実行され、次にコンストラクターが実行され、最終的に静的ブロックが実行されます。aStaticstatic

于 2015-09-24T05:51:47.587 に答える