创建子类的构造函数

时间:2016-11-04 15:12:25

标签: inheritance

enter image description here enter image description here

当我为sundae类创建构造函数时,eclipse说我必须明确调用另一个构造函数,但我不明白如何解决它。 在我的main方法中,当我创建一个Cake eclipse类型的新对象时,没有可以访问DessertCafe类型的封闭实例,但是当我创建第二个时,它可以工作。任何人都可以帮我修理它们

2 个答案:

答案 0 :(得分:0)

如果Sundae扩展IceCream(一个可疑的模型,但我离题),那么隐式创建Sundae必须首先创建IceCream;并且你明确地给了一个带参数的构造函数(cost)。因此,您必须告诉Sundae构造函数要传递给IceCream构造函数的内容。

这是super关键字的作用。

public Sundae( int topping ) {
    super( 5 ); // <- what's the cost?  5 bucks?
    // ...
}

通常,如果使用未知的构造函数参数扩展类,则必须使新构造函数也具有该参数:

public Sundae( int topping, int cost ) {
    super( cost );
    // ...
}

当您刚开始使用Java时,最好包含所有可选内容。虽然在您的类构造函数中调用super是可选的,但如果您放置一个,则编译器会注入一个类似于

的文件。
super();

调用基类的0-arg构造函数。尽管在Java中包含构造函数是可选的,但是如果你在 not 中指定了基类中的任何构造函数,那么编译器会插入一个如下所示:

public BaseClass() {
    super();
}

此外,如果你 在基类中指定了一个带有参数的构造函数,那么编译器会创建一个隐式的0-arg构造函数。这使得任何尝试不带参数调用super(),例如上面提到的编译器生成的这样的调用都是错误的。

关于您的Cake问题,您已在类中声明了一个类,而没有创建嵌套类static。这意味着您可以在没有封闭类实例的情况下实例化它。首次使用Java时,应该声明所有嵌套类static

答案 1 :(得分:0)

是的,在子类中执行任何操作之前,需要调用子类的父类的构造函数。

假设你的父类如下:

package my.icecream.shop;

abstract public class IceCream {

    protected String mFlavour;

    public IceCream(String flavor) {
        mFlavour = flavour;
    }

    abstract public void serve();
}

您将其子类化为圣代,如下所示:

package my.icecream.shop;

public class Sundae extends IceCream {

    protected int mServes;

    public Sundae(String flavour, int serves) {
        // this super call is important and must come first to anything
        super(flavour);
        mServes = serves;
    }
}