6

最近、ArrayList を静的に初期化するための新しい構文のように見えるものを見つけました。
new ArrayList() {{ add("first"); add("second"); }};

私の質問は、そこで実際に何が起こっているのですか? staticそれは静的ブロックを定義するためのショートカットですか (キーワードが必要だと思いました)? それとも、デフォルトのコンストラクターを定義する方法ですか? 他の何か?これが有効になった Java のバージョンは何ですか?

説明とさらに読むためのリンクをいただければ幸いです。

編集:イニシャライザブロックがコンストラクタの前または後に実行されるかどうかを示すための私のテストクラスは以下のとおりです。結果は、初期化ブロックが他のコンストラクター コードの前に実行されることを示しています。

import org.junit.Test;

public class InitializerBlockTest {
    class InitializerTest {
        {
        System.out.println("Running initalizer block");
        }

        public InitializerTest() {
            System.out.println("Running default constructor");
        }
    }

    class SubClass extends InitializerTest {
      {
        System.out.println("Running subclass Initializer block");
      }

      public SubClass()  {
        System.out.println("Running subclass constructor");
      }
    }

    @Test
    public void testIt() {
        new SubClass();
    }
}

出力:

Running initalizer block
Running default constructor
Running subclass Initializer block
Running subclass constructor
4

3 に答える 3

7

add() を 2 回呼び出すインスタンス初期化子を使用して、ArrayList の新しい匿名サブクラスを作成しています。

以下と同じです:

class MyList extends ArrayList
{

{ // This is an instance initializer; the code is invoked before the constructor.
add("first"); 
add("second");
}

public MyList() {
    super();
    // I believe initializers run here, but I have never specifically tested this
    }
}

...

List list=new MyList();

個人的には、クラスファイルの爆発につながるため、イディオムとしてはお勧めしません。

于 2010-12-08T20:05:53.113 に答える
4

インスタンス変数の初期化ブロックです。

オラクルのドキュメントから:

インスタンス変数の初期化ブロックは、静的初期化ブロックと同じように見えますが、 static キーワードはありません。

{

    // whatever code is needed for initialization goes here
}

Java コンパイラは、イニシャライザ ブロックをすべてのコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクター間でコードのブロックを共有できます。

参照: http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

于 2010-12-08T20:06:00.303 に答える
3

あなたが書くとき、new ArrayList() { }あなたはの匿名サブクラスを作成していますArrayList{ }コードの最も内側の括弧内のas は初期化ブロックを示し、実際にはすべてのコンストラクターにコピーされます。

編集:皆さん、すぐに答えてください!

于 2010-12-08T20:13:00.680 に答える