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
}

如果我像这样调用第二个构造函数:

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

比编译器告诉我的,构造函数应该是第一条语句。那么我需要将所有逻辑从第二个构造函数复制到第一个构造函数吗?

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 回答