、メンバ変数mBar
のみFoo
オブジェクトの最初の構築時にインスタンス化されることを...と、このmBar
インスタンス化は、将来のすべてのFoo
オブジェクトと共有することになるというのが私の仮定でありますただし、Bar()
コンストラクターは再度呼び出されません。これは正確ですか?質問次のコードで
public class Foo {
private static Bar mBar = new Bar();
public Foo() {
}
、メンバ変数mBar
のみFoo
オブジェクトの最初の構築時にインスタンス化されることを...と、このmBar
インスタンス化は、将来のすべてのFoo
オブジェクトと共有することになるというのが私の仮定でありますただし、Bar()
コンストラクターは再度呼び出されません。これは正確ですか?質問次のコードで
public class Foo {
private static Bar mBar = new Bar();
public Foo() {
}
最初のFooを作成する前にオブジェクトを実際に構築することができます。ClassloaderがFoo.classをメモリにロードするときに実行されます。これはいつでも起こります。特に、他のクラスFooクラスを使用している場合、またはクラスの静的メソッドを呼び出す場合は....
あなたの前提はほとんど正確です。 mBarはクラスのすべてのインスタンスに対して(同じプロセス内で)一度だけ初期化されます。他のクラスがBarコンストラクタを呼び出すのを止めるわけではないことに注意してください。
編集:コメントに指摘されているように、必ずしもFooオブジェクトの最初の構築時ではありません。 Fooオブジェクトへの最初の実行参照で、クラスローダーが静的メンバーを初期化します(これによってBar()が呼び出されます)。
これは本当に..最初のFooオブジェクト作成の前に実行される可能性が高いです。 –
クラス Fooが最初に読み込まれると、ほぼインスタンス化されます。したがって、Foo.mBar(publicの場合)を呼び出すと、Fooのインスタンスがインスタンス化されていないにもかかわらず、barインスタンスが取得されます。
実際には、静的なので、この変数にアクセスするためのオブジェクトは必要ありません。したがって、オブジェクトをインスタンス化せずに使用することができます
しかしそれは私的です。静的な定義で私の主な目的は、すべてのFooオブジェクト間で共有することです。 – dfetter88
これは問題ありませんが、同じコンセプトがそのまま適用されます:) –
仮説は、試したときに観察したものと一致していますか? –
mBarのインスタンス化は実際にはすべてのFooオブジェクトと共有されますが、Barコンストラクタが各Fooの構築時に呼び出されるかどうかはわかりません。 – dfetter88
上記の例では、Fooオブジェクトがインスタンス化された回数に関係なく、Bar()が1回だけ呼び出されます。 Bar()コンストラクタが再度呼び出されないことは、必ずしも真実ではありません。静的メンバ変数が既に構築されているので、このクラスによって再度呼び出されることはありません。しかし、他のクラス、メソッドなどが別のBarオブジェクトをインスタンス化してコンストラクタを呼び出すのを防ぐものはありません。 – Marvo