dar*_*ram 6 java inheritance constructor initialization subclass
我有
class A {
int var;
public A(int x) {
var = x;
}
}
class B extends A {
int var2;
public B(int x, int y) {
super(...);
var2 = y;
x = f(y);
}
}
Run Code Online (Sandbox Code Playgroud)
对于子类B,我需要计算在A的构造函数中使用的值x.如果我可以自由移动super
到我的下面,x=f(y)
那么我可以将结果传递给A(超级)的构造函数.但是super必须是B构造函数中的第一行.
有没有办法在第一次用适当的值初始化A?怎么样的A.var是最终的,我不能回去并在施工后改变它?
当然,我可以说super(f(y))
,但我可以想象这会变得困难的情况.
hvg*_*des 10
假设var
是私有的,你需要用构造函数设置值(这似乎是问题的关键点,否则有很多简单的解决方案),我会用静态类似工厂的方法来做.
class B extends A {
int var2;
public static B createB(int x, int y) {
x = f(y);
return new B(x, y);
}
public B(x, y) {
super(x);
this.var2 = y;
}
}
Run Code Online (Sandbox Code Playgroud)
类似的东西.您没有选择,因为显式构造函数调用必须发生在包装构造函数的第一行.