use*_*804 1 java inheritance constructor
我有一个超类'BuildingMaterial'和大量子类,即Stone,Wood,Clay等.所有子类的行为都相似:1个int字段,以单位形式存储建筑材料的数量.它们可以构造为无参数或带有int.我已经知道BuildingMaterial的所有子类都有这两个构造函数,我如何避免将它们编码到每个类中?这是我不想在每个课程中做的一个例子:
public final class Stone extends BuildingMaterial {
private int amount;
//constructors
public Stone() {
amount = 0;
}
public Stone(int i) {
amount = i;
}
//methods
public int getAmount() {
return amount;
}
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,答案是你不能.这是Java语言的限制.每个类都需要自己的构造函数 - 您不能简单地从父类继承它们.Java编译器将为您生成的唯一构造函数是默认构造函数(无参数),并且只有在您根本不指定任何构造函数时才生成它.
你在这里做的最好的是重构你的代码,所以amount在超类中:
public abstract class BuildingMaterial {
private int amount;
//constructors
public BuildingMaterial() {
this(0);
}
public BuildingMaterial(int i) {
amount = i;
}
//methods
public int getAmount() {
return amount;
}
}
Run Code Online (Sandbox Code Playgroud)
然后利用super调用在子类中委托超类的构造函数:
public final class Stone extends BuildingMaterial {
//constructors
public Stone() {
super();
}
public Stone(int i) {
super(i);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我将无参数构造函数的主体更改amount=0;为this(0);.我个人认为这是更好的风格,因为如果您决定将其他初始化代码添加到构造函数体中,则只需将其添加到1参数构造函数中,零参数构造函数将只将所有工作委托给它.