静的インスタンスフィールドを持つJavaクラスでは、フィールドにアクセスするたびにコンストラクターが呼び出されますか、それとも最初のアクセス時にのみ呼び出されますか?コンストラクターで静的フィールドを初期化しますが、フィールドはアクセスごとに初期化されるため、これによって速度が低下するのではないかと考えていました。
3 に答える
コンストラクターで静的フィールドを初期化します。
しないでください。コンストラクター内で静的フィールドを初期化しないでください。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
。
実際、インスタンスフィールドにアクセスしても、コンストラクターが毎回呼び出されるわけではありません。コンストラクタは、新しく作成されたインスタンスのに一度使用initialize
さstate
れます。そして、そのフィールドへのさらなるアクセスと変更のために、constructor
呼び出されません。
したがって、クラスのフィールドにアクセスするときはいつでも、コンストラクターが果たす役割はまったくありません。
静的フィールドのオブジェクトのコンストラクターは、フィールドに初めてアクセスする前のある時点で1回だけ呼び出されます。通常のインスタンスコンストラクターで静的フィールドを初期化しないでください。特別な初期化が必要な場合は、次のような静的初期化ブロックを指定する必要があります。
public class Test {
static int[][] a = new int[20][];
static {
for (int i = 0 ; i != 20 ; i++) {
a[i] = new int[i+1];
}
}
}
静的変数は、クラスがロードされるときにロードされます。そして一度だけ。JLSによると:
フィールドが静的であると宣言された場合、クラスのインスタンスがいくつ(場合によってはゼロ)作成されても、フィールドのインカネーションは1つだけ存在します。クラス変数と呼ばれることもある静的フィールドは、クラスが初期化されるときに具体化されます
だからこれはあなたの質問に答えます。つまり、クラスがロードされたときです:)
静的変数は、JVMがシャットダウンされるまで続きます。