0

我々はできる :

class A {
     // some code
}

class B {
    A obj = new A(); // ???
}

クエリ:

  • 私の理解では、obj(クラスのA)インスタンスは静的ではないため、のクラスメモリでは利用できませんB
  • その場合、すべてのインスタンスに対して初期化されますBか?
  • obj実際にクラス メモリB(つまり、静的)にとどまる場合、インスタンスの初期化はいつ行われますobjか?
  • いずれにせよ、これは良い習慣ですか?
  • では、これができるのになぜコンストラクターがあるのでしょうか?

お気軽に訂正してください。

4

3 に答える 3

5

このように初期化されたフィールドは一般的な方法です。

これらは、インスタンス初期化ブロックと同様に、コンストラクターの一部と考えることができます。

パラメータを取得し、複雑なロジックを使用する場合があるため、まだコンストラクターがあります。

このパターンは、コンストラクターが複数ある場合に特に便利です (コード パスごとにフィールドが初期化されます)。

于 2013-10-01T03:37:12.727 に答える
0

A は静的ではないため、クラス メモリでは使用できません。

Right.classAはインスタンス化されるたびBにインスタンス化されます

B のすべてのオブジェクトに対して事前に初期化されますか?

はい。 のオブジェクトを作成するたびにBAオブジェクトも作成されます

いずれにせよ、それは良い習慣ですか?

実際には、コンストラクターを介してインスタンス化するのと同じです。したがって、良い習慣でも悪い習慣でも問題ありません

では、これができるのになぜコンストラクターがあるのでしょうか?

複数のコンストラクターがある場合A、すべてのコンストラクターでインスタンス化する必要はありません。

于 2013-10-01T03:38:03.513 に答える
0

A は静的ではないため、クラス メモリでは使用できません。

正しい。Bfield を取得するには、 のインスタンスが必要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、フィールド、コンストラクター、または明示的な初期化子で初期化を行う間に目に見える違いはありません。

フィールドが宣言されている場所に値を割り当てる方が便利な場合があります。

于 2013-10-01T03:40:15.280 に答える