9

私はコンストラクタを持っています

private Double mA;
private Double mB;

Foo(Double a) {
  mA = a;
  mB = a + 10;
}

Foo(Double a, Double b) {
  mA = a;
  mB = b;
  // some logic here
}

次のように2番目のコンストラクターを呼び出すと:

Foo(Double a) {
  Double b = a + 10;
  this(a, b);
}

コンパイラーが私に言うよりも、そのコンストラクターは最初のステートメントでなければなりません。では、すべてのロジックを 2 番目のコンストラクターから最初のコンストラクターにコピーする必要がありますか?

4

3 に答える 3

24

代わりにやってみませんthis(a, a+10)か?

this()orsuper()が存在する場合、コンストラクターの最初のステートメントでなければならないことに注意してください。ただし、引数でロジックを実行することはできます。複雑なロジックを実行する必要がある場合は、引数でクラス メソッドを呼び出すことで実行できます。

static double calculateArgument(double val) {
    return val + 10; // or some really complex logic
}

Foo(double a) {
    this(a, calculateArgument(a));
}

Foo(double a, double b) {
    mA = a;
    mB = b;
}
于 2012-10-14T08:16:05.920 に答える
6

コンストラクターを使用this()またはsuper()呼び出して他のコンストラクターを呼び出す場合は、常にコンストラクターの最初のステートメントにする必要があります。

そのため、以下のコードはコンパイルされません: -

Foo(Double a) {
  Double b = a + 10;
  this(a, b);
}

上記のルールに従うように変更できます: -

Foo(Double a) {
  this(a, a + 10);  //This will work.
}
于 2012-10-14T08:16:20.340 に答える
2

別のコンストラクターの呼び出しは、コンストラクターの最初の行である必要があります。

次のような明示的なコンストラクター呼び出しを呼び出すことができます-

Foo(Double a) {
  this(a, a+10);
}
于 2012-10-14T08:16:47.783 に答える