我有一个构造函数
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);
}
比编译器告诉我的那样,构造函数应该是第一个语句。那么我需要将所有逻辑从第二个构造函数复制到第一个吗?
答案 0 :(得分: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;
}
答案 1 :(得分:6)
如果在构造函数中使用this()
或super()
调用来调用其他构造函数,则它应始终是构造函数中的第一个语句。
这就是为什么您的下面的代码无法编译: -
Foo(Double a) {
Double b = a + 10;
this(a, b);
}
您可以修改它以遵循上述规则: -
Foo(Double a) {
this(a, a + 10); //This will work.
}
答案 2 :(得分:2)
调用另一个构造函数必须是构造函数中的第一行。
您可以调用显式构造函数调用,如 -
Foo(Double a) {
this(a, a+10);
}