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

我有一个构造函数

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); } 

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

你为什么不这样做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; } 

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

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

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

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

 Foo(Double a) { this(a, a + 10); //This will work. } 

调用另一个构造函数必须是构造函数中的第一行。

您可以调用显式构造函数调用,如 –

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