2

以下のコードに関する簡単な質問:

public class Test {

    public final static Test t1 = new Test("test 1");
    public final static Test t2 = new Test("test 2");
    public final static Test t3 = new Test("test 3");

    private String s;

    private Test (string s1) {
        s = s1;
    }
}

このコードがそれ自体の無制限のインスタンスを作成するかどうかについて混乱していますか?

4

5 に答える 5

3

いいえ、VMは次のことを行いません。"create unlimited instances of itself."

静的フィールド(、、t1およびt2)は、レベルではなく、レベルでt31回(それぞれ)作成されます。3つのフィールドはすべてのインスタンス間で共有されます。ClassInstance

于 2013-03-12T14:10:03.043 に答える
1

t1変数が静的に初期化t2t3れるため(つまり、インスタンスごとに1回ではなく、クラスがロードされるときに1回)、コードはそれ自体の無制限のインスタンスを作成しません。これは、宣言と宣言の割り当ての組み合わせによるものです。static

あなたは正確に何をしているのかを読みたいかもしれstaticません。

役立つメモ:

一方、以下の例では、static変数を使用しているときに、インスタンスが作成されたときにインスタンスが初期化され(コンストラクターでの割り当てのため)、StackOverflowErrorが発生します。

public class Test {
   static Test t1;
   Test () {
      t1 = new Test();
   }
}
于 2013-03-12T14:10:04.510 に答える
1

静的メンバーは、作成されたオブジェクトの一部ではありません。Testしたがって、オブジェクトが無限に作成されることはありません。

于 2013-03-12T14:10:46.257 に答える
0

静的 (t1、t2、および t3) 宣言により、各インスタンスがこれらの変数の独自のコピーを持っているという印象が得られるためです。

実際には、これは起こることではありません。静的変数はインスタンスごとには作成されません。JVM には、それらのインスタンスが 1 つだけ存在します。

于 2013-03-12T14:12:05.517 に答える
0

もしそれが次のようなものだったら

public class Test {
   // no static so these are created for each instance of A or each time constructor is called
   public final Test t1 = new Test("test 1");
   public final Test t2 = new Test("test 2");
   public final Test t3 = new Test("test 3");

   private String s;

   private Test (string s1){
      s = s1
   }

}

t1次に、インスタンス レベル変数として無制限のインスタンスを作成しt2ます。t3

しかし、あなたの場合、インスタンスはクラスの読み込み時staticに作成され、各インスタンスでは作成されないため、無制限のインスタンスはありません。

于 2013-03-12T14:13:30.203 に答える