来自构造函数的Java调用构造函数

use*_*151 8 java constructor

我有一个构造函数

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
}
Run Code Online (Sandbox Code Playgroud)

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

Foo(Double a) {
  Double b = a + 10;
  this(a, b);
}
Run Code Online (Sandbox Code Playgroud)

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

nne*_*neo 21

你为什么不这样做this(a, a+10)呢?

注意,this()或者super()必须是构造函数中的第一个语句(如果存在).但是,你仍然可以在参数中做逻辑.如果需要执行复杂逻辑,可以通过在参数中调用类方法来实现:

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;
}
Run Code Online (Sandbox Code Playgroud)


Roh*_*ain 6

如果在构造函数中使用this()super()调用其他构造函数,则它应始终是构造函数中的第一个语句.

这就是为什么你的下面的代码不能编译: -

Foo(Double a) {
  Double b = a + 10;
  this(a, b);
}
Run Code Online (Sandbox Code Playgroud)

您可以修改它以遵循上述规则: -

Foo(Double a) {
  this(a, a + 10);  //This will work.
}
Run Code Online (Sandbox Code Playgroud)