继承java构造函数

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)

Dao*_*Wen 5

可悲的是,答案是你不能.这是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参数构造函数中,零参数构造函数将只将所有工作委托给它.