1

コンストラクターとゼロパラメーターコンストラクターの (概念的な) 違いは何ですか? 例:

この実装がプログラムに与える影響

public Person() {
firstName = "UNKNOWN";
lastName = "UNKNOWN";
gender = '?';
retired = false;
age = 0;
address = null;
}

と比較して...これ:

public Person(String f, String l, int a, char g) {
firstName = f;
lastName = l;
age = a;
gender = g;
retired = false;
address = null;
}

編集: パラメータの数は無視してください...

4

7 に答える 7

6

クラスのコンストラクターを定義しない場合、既定のパラメーターなしのコンストラクターがコンパイラによって自動的に作成されます。デフォルト コンストラクターは、デフォルトの親コンストラクター (super()) を呼び出し、すべてのインスタンス変数をデフォルト値 (数値型の場合はゼロ、オブジェクト参照の場合は null、ブール値の場合は false) に初期化します。

デフォルトのコンストラクターは、コンストラクターがない場合にのみ作成されます。クラスのコンストラクターを定義した場合、デフォルトのコンストラクターは自動的に作成されません。

コンストラクターとゼロパラメーターコンストラクターの (概念的な) 違いは何ですか?

変わりはない。

于 2013-03-19T01:41:06.270 に答える
2

また、複数のコンストラクターがある場合でも、すべての実際の作業を実行するコンストラクターを 1 つだけ使用することをお勧めします。指定コンストラクターという用語は Objective-C に由来しますが、それでも良い考えです。次のように書くとします。

public Person(String f, String l, int a, char g) {
        // Use more expressive argument names.
    firstName = f;
    lastName = l;
    age = a;
    gender = g;
    retired = false;
    address = null;
}

次に、引数のないコンストラクターを次のように書き直します。

public Person() {
    this(null, null, 0, '?');
        // Invoke the designated constructor with those arguments.
    retired = false;
    address = null;
}

コンストラクターの最初のステートメントが の場合、コンストラクthis(...)ターはクラスの他のコンストラクターの 1 つを呼び出しています。同様に、コンストラクターの最初のステートメントが の場合super(...)、親クラスのコンストラクターを呼び出しています。どちらも行わない場合は、それsuper()が想定されます。

次に、retiredaddressは両方のコンストラクターで同じように設定されるため、宣言でそれらを初期化します。

private boolean retired = false;
private String address = null;  // If it's a String; it could be its own object type.

そして、falsenullはインスタンス変数の初期化のデフォルト値であるため、これらの 2 行を次のように置き換えます。

private boolean retired;
private String address;

後で、エラー チェックを追加できます。たとえば、人々は負の年齢を持っていないので、ステートメントを挿入します

if (a < 0) {
    throw new IllegalArgumentException("A Person cannot have a negative age: "
       + a);
}

指定されたコンストラクターの先頭にあると便利です。このように、一度だけ行う必要があります。

Java 列挙型について学ぶと、次のように記述して性別変数をより正確にすることができます。

// Gender is a grammatical term, Sex is a biological term.
public enum Sex {
    MALE, FEMALE;
}

Sex変数の代わりに使用charしますgender

于 2013-03-19T04:45:53.783 に答える
0

オブジェクトをインスタンス化するときにコンストラクターが呼び出されます。ゼロ パラメーター (または「引数なし」) コンストラクターは、引数を必要としないコンストラクターです。クラスには、それぞれ異なる引数を持つ複数のコンストラクターを含めることができます。

引数のないコンストラクターは、リフレクションを使用してオブジェクトのプロパティを設定するツールに特に役立ちます。デフォルトの引数のないコンストラクターを使用してオブジェクトを構築し、そのプロパティは、セッター (別名ミューテーター) で使用される名前と一致することによって設定されます。

引数を持つコンストラクターは、不変オブジェクトの作成に特に適しています。オブジェクトは、作成時に 1 回入力することができ、その後は変更されないことが保証されます (すべてのプロパティが同様に不変である場合)。

于 2013-03-19T01:56:55.707 に答える
0

最初にステートメントコンストラクターがない場合、クラスはコンストラクターを作成できますが、このコンストラクターはパラメーターではなく、次のようにすべてのインスタンス変数をデフォルト値 (数値型の場合はゼロ、オブジェクト参照の場合は null、ブール値の場合は false) に初期化します

public Person() {
firstName = null;
lastName = null;
gender = null;
retired = false;
age = 0;
address = null;
}

ただし、このコンストラクターは次のようにオーバーライドできます。

public Person() {
firstName = "firstName";
lastName = "lastName";
gender = '?';
retired = true;
age = 0;
address = "someAddress";
}

このコンストラクター を次のようにオーバーロードします。

public Person(String f, String l, int a, char g) {
firstName = f;
lastName = l;
age = a;
gender = g;
retired = false;
address = null;
}'
于 2013-03-19T02:16:52.200 に答える
0

他のコンストラクターが定義されていない場合、ゼロパラメーターのコンストラクターが自動作成されます。パラメーターを持つコンストラクターは、オブジェクトのカスタマイズされた初期化に使用されます。

于 2013-03-19T01:37:59.927 に答える
0

最初のコンストラクターの場合、 をインスタンス化するPersonときはいつでも、コンストラクターで定義された値で開始されます。それを変更するには、セッターを使用する必要があります。

2 番目のコンストラクターでは、 をインスタンス化するときはいつでもPerson、適切なパラメーターを渡す必要があります。これは、セッターを使用して後で値を変更することなく、オブジェクトを作成できることを意味します。

于 2013-03-19T01:40:12.663 に答える
0
  1. コンストラクターを定義しない場合、既定のコンストラクター (パラメーターを持たない) が既定で生成されます。
  2. ユーザー定義のコンストラクターがある場合、デフォルトのコンストラクターはまったく生成されません。
  3. クラスがユーティリティクラスでない限り、コンストラクターが必要です。
于 2013-03-19T01:40:13.757 に答える