A は静的ではないため、クラス メモリでは使用できません。
正しい。B
field を取得するには、 のインスタンスが必要A obj
です。
B のすべてのオブジェクトに対して事前に初期化されますか?
はい。new A
作成ごとに個別に作成B
されます。
これがobjメモリにとどまる必要がある場合、この初期化はいつ行われますか?
なし
いずれにせよ、それは良い習慣ですか?
はい。これはオブジェクト合成と呼ばれ、他のオブジェクトからオブジェクトを合成することは、オブジェクト指向設計を使用して問題を分解する 2 つの主な手段の 1 つです。もう一つは継承です。
では、これができるのになぜコンストラクターがあるのでしょうか?
これは単なるシンタックス シュガーです。以下はすべて同等です。
class B {
A obj = new A(); // field initializer
}
class B {
A obj;
B() {
A = new A(); // initialized in constructor
}
}
class B {
A obj;
{ obj = new A(); } // instance initializer
}
初期化中に何も読み取らない限りobj
、フィールド、コンストラクター、または明示的な初期化子で初期化を行う間に目に見える違いはありません。
フィールドが宣言されている場所に値を割り当てる方が便利な場合があります。