继承java构造函数

时间:2013-09-14 17:20:05

标签: 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;
    }
}

5 个答案:

答案 0 :(得分: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;
    }

}

然后使用super调用来委托子类中的超类构造函数:

public final class Stone extends BuildingMaterial {

    //constructors
    public Stone() {
      super();
    }

    public Stone(int i) {
      super(i);
    }

}

请注意,我将无参数构造函数的主体从amount=0;更改为this(0);。我个人认为这是更好的风格,因为如果您决定将其他初始化代码添加到构造函数体中,则只需将其添加到1参数构造函数中,零参数构造函数将只将所有工作委托给它。

答案 1 :(得分:2)

您必须使用inheritance

public abstract class BuildingMaterial {
    private int amount;

    //constructors
    public BuildingMaterial() {
        amount = 0;
    }

    public BuildingMaterial(int i) {
        amount = i;
    }

    //methods
    public int getAmount() {
        return amount;
    }
}


public class Stone extends BuildingMaterial {
    public Stone() {
        super();
    }

    public Stone(int i) {
        super(i);
    }
}

这样BuildingMaterial的所有子类都可以通过getter和setter访问amount

您可能将amount声明为protected,因此您不需要getter或setter来访问子类中的该字段。

答案 2 :(得分:1)

使用super关键字来减少代码,但super是构造函数中的第一行

public class Stone extends BuildingMaterial {
    public Stone() {
        super();
    }

    public Stone(int i) {
        super(i);
    }
} 

答案 3 :(得分:0)

如果所有类都具有属性amount,则该属性可以从父级继承。在父类amount中定义BuildingMaterial,然后使用super从子类构造函数中调用父构造函数来设置amount值。

答案 4 :(得分:0)

在你的问题中你不清楚你想要避免什么...假设你在谈论避免在所有子类中编写多个构造函数。我认为不可能这样做。下面定义BuildingMeterial构造函数并从baseClass调用super()将是最好的解决方案。