如何在java中从超类继承构造函数的一部分到子类

时间:2014-07-17 04:43:49

标签: java inheritance subclass superclass extends

如何将超类构造函数的一些参数继承到子类构造函数? 例如,我只想将权重和高度继承到子类,如何为子类构造约束器?

public abstract class People {

    protected double weight;

    protected int height;

    protected String mood;

    public People(double weight, int height, String mood) {

        this.weight = weight;
        this.mood = mood;
}

public class Health extends People {

    private String bloodType;

    public Health(double weight, int height, String bloodType){
        super(weight,height); // this won't work
        this.bloodType = bloodType;
}

3 个答案:

答案 0 :(得分:1)

要么你需要为超类中的构造函数提供一种情绪(可能是一个常量),你需要将一个构造函数添加到超类中采取一种心情。你需要问自己,每个Question/People真的是否需要情绪,以及DivisionQuestion/Health的情绪是什么。 (对于您的代码目前在使用的类名方面不一致,这没有任何帮助。)

就像调用普通方法一样,你不能为某些参数而不是其他参数提供参数。

答案 1 :(得分:0)

你只需要重载构造函数,或者可以在超类中使用变量“mood”的默认值。尽管如此Effective Java建议使用静态工厂方法而不是重载构造函数。

答案 2 :(得分:0)

只是为了补充Jon Skeets和Harshil Sukhadias的答案。您需要两个构造函数,一个只接受heightweight并为mood设置默认值,或者使用默认值调用第一个构造函数。

public abstract class People {
    // ...
    public static final String MOOD_DEFAULT = "Happy";
    public People(double weight, int height, String mood) {
        // ...
    }
    // second ctor, calling the first with a default for mood...
    public People(double weight, int height) {
       this(weight,height,Question.MOOD_DEFAULT);
    }
}

public class Health extends People{
    // ...
    public Health(double weight, int height, String bloodType) {
        super(weight,height);
        // ... or super(weight,height,Question.MOOD_DEFAULT);
    }
}

拥有这种类型的层次结构可能对实现构建器模式很有用,请查看Josuah Blochs“Effective Java”的第2章第2项以获取更多详细信息。