1

コンストラクター内またはコンストラクター外でメンバーを作成する際の違いは何ですか?

例 1:

public class Person
{
List<Person> friends = new List<Person>();

public Person()
{

}

}

例 2:

public class Person
{
List<Person> friends;

public Person()
{
friends = new List<Person>();
}

}

例として C# を使用しましたが、これはどの oop 言語にも当てはまります。

2つの間に実際的な違いはありますか?何らかの理由で、それを実装するためのよりクリーンな方法として、例 2 を説明してもらいました。

4

3 に答える 3

1

Javaの観点から分析してみます。変数/メンバーが変数でない限り、staticそれは問題ではありません。例 2 はlazy initialization、コンストラクターが呼び出されるまでフレンド リストの初期化を延期する場合に参照されることがあります。しかし、友人はstaticコンパイラではないため、例 1 を例 2 と同様の方法で扱います。ここから

ただし、フィールド宣言はメソッドの一部ではないため、ステートメントとして実行することはできません。代わりに、Java コンパイラはインスタンス フィールドの初期化コードを自動的に生成し、それをクラスのコンストラクタまたは複数のコンストラクタに配置します。初期化コードは、ソース コードに現れる順序でコンストラクターに挿入されます。つまり、フィールド初期化子は、その前に宣言されたフィールドの初期値を使用できます。

したがって、コンパイラは例 1 のコードを例 2 に変換して、同様の方法で初期化できるようにします。

于 2013-10-19T19:53:52.037 に答える