3

静的インスタンスフィールドを持つJavaクラスでは、フィールドにアクセスするたびにコンストラクターが呼び出されますか、それとも最初のアクセス時にのみ呼び出されますか?コンストラクターで静的フィールドを初期化しますが、フィールドはアクセスごとに初期化されるため、これによって速度が低下するのではないかと考えていました。

4

3 に答える 3

13

コンストラクターで静的フィールドを初期化します。

しないでください。コンストラクター内で静的フィールドを初期化しないでください。staticフィールドは、クラスのインスタンスに関連付けられたものではありません。クラスにバインドされています。その変数のコピーは1つだけで、すべてのインスタンスでアクセスされます。したがって、コンストラクターで初期化する場合、インスタンスを作成するたびに、そのフィールドは他のすべてのインスタンスに対して再初期化されます。

ブロックを使用static initializerして静的フィールドを初期化するか、宣言の場所で初期化する必要があります。

class Demo {
    private static int x;  // Either initialize it here.

    static {   // Or use static initializer block
        x = 10;
    }
}

静的インスタンスフィールドでは、フィールドにアクセスするたびに呼び出されるコンストラクターです。

いいえ。静的フィールドはでアクセスされclassます。これらは、クラスがロードされるときにロードおよび初期化されます。その後、で変更できclass nameます。その場合、変更はすべてのインスタンスに適用されます。したがって、にアクセスするたびにコンストラクターは呼び出されませんstatic field

実際、インスタンスフィールドにアクセスしても、コンストラクターが毎回呼び出されるわけではありません。コンストラクタは、新しく作成されたインスタンスのに一度使用initializestateれます。そして、そのフィールドへのさらなるアクセスと変更のために、constructor呼び出されません。

したがって、クラスのフィールドにアクセスするときはいつでも、コンストラクターが果たす役割はまったくありません。

于 2012-11-24T20:06:15.490 に答える
1

静的フィールドのオブジェクトのコンストラクターは、フィールドに初めてアクセスする前のある時点で1回だけ呼び出されます。通常のインスタンスコンストラクターで静的フィールドを初期化しないでください。特別な初期化が必要な場合は、次のような静的初期化ブロックを指定する必要があります。

public class Test {
    static int[][] a = new int[20][];
    static {
        for (int i = 0 ; i != 20 ; i++) {
            a[i] = new int[i+1];
        }
    }
}
于 2012-11-24T20:06:07.380 に答える
0

静的変数は、クラスがロードされるときにロードされます。そして一度だけ。JLSによると:

フィールドが静的であると宣言された場合、クラスのインスタンスがいくつ(場合によってはゼロ)作成されても、フィールドのインカネーションは1つだけ存在します。クラス変数と呼ばれることもある静的フィールドは、クラスが初期化されるときに具体化されます

だからこれはあなたの質問に答えます。つまり、クラスがロードされたときです:)

静的変数は、JVMがシャットダウンされるまで続きます。

于 2012-11-24T20:06:43.977 に答える